Siempre que llamo al shutdownNow()
o shutdown()
, no se apaga. Leí algunos hilos en los que decía que el cierre no está garantizado. ¿Alguien puede proporcionarme una buena forma de hacerlo?¿Cómo cerrar un ExecutorService?
Respuesta
El patrón típico es:
executorService.shutdownNow();
executorService.awaitTermination();
Al llamar shutdownNow
, el ejecutor (generalmente) tratan de interrumpir los hilos que gestiona. Para que el cierre sea más ordenado, debe detectar la excepción interrumpida en los hilos o verificar el estado interrumpido. Si no lo haces, tus hilos se ejecutarán para siempre y tu ejecutor nunca podrá apagarse. Esto se debe a que la interrupción de subprocesos en Java es un proceso colaborativo (es decir, el código interrumpido debe hacer algo cuando se le solicita detenerse, no el que interrumpe el código).
Por ejemplo, el siguiente código imprime Exiting normally...
. Pero si comenta la línea if (Thread.currentThread().isInterrupted()) break;
, imprimirá Still waiting...
porque los hilos dentro del ejecutor aún se están ejecutando.
public static void main(String args[]) throws InterruptedException {
ExecutorService executor = Executors.newFixedThreadPool(1);
executor.submit(new Runnable() {
@Override
public void run() {
while (true) {
if (Thread.currentThread().isInterrupted()) break;
}
}
});
executor.shutdownNow();
if (!executor.awaitTermination(100, TimeUnit.MICROSECONDS)) {
System.out.println("Still waiting...");
System.exit(0);
}
System.out.println("Exiting normally...");
}
Alternativamente, podría ser escrita con un InterruptedException
así:
public static void main(String args[]) throws InterruptedException {
ExecutorService executor = Executors.newFixedThreadPool(1);
executor.submit(new Runnable() {
@Override
public void run() {
try {
while (true) {Thread.sleep(10);}
} catch (InterruptedException e) {
//ok let's get out of here
}
}
});
executor.shutdownNow();
if (!executor.awaitTermination(100, TimeUnit.MICROSECONDS)) {
System.out.println("Still waiting...");
System.exit(0);
}
System.out.println("Exiting normally...");
}
Cómo sabe si también inicia el apagado 'Thread.interrupt()', desde la API de Java no lo hace parece que 'shutdown' interrumpe los hilos? – Bionix1441
@ Bionix1441 No, no es así. 'shutdownNow' hace sin embargo. – assylias
La mejor manera es lo que realmente tenemos en el javadoc que es:
Los siguientes cierra método abajo de un ExecutorService en dos fases, primero llamando al
shutdown
para rechazar tareas entrantes, y luego llamando alshutdownNow
, si es necesario, para cancelar las tareas persistentes:
void shutdownAndAwaitTermination(ExecutorService pool) {
pool.shutdown(); // Disable new tasks from being submitted
try {
// Wait a while for existing tasks to terminate
if (!pool.awaitTermination(60, TimeUnit.SECONDS)) {
pool.shutdownNow(); // Cancel currently executing tasks
// Wait a while for tasks to respond to being cancelled
if (!pool.awaitTermination(60, TimeUnit.SECONDS))
System.err.println("Pool did not terminate");
}
} catch (InterruptedException ie) {
// (Re-)Cancel if current thread also interrupted
pool.shutdownNow();
// Preserve interrupt status
Thread.currentThread().interrupt();
}
}
- 1. Apagar un ExecutorService
- 2. de ExecutorService presentar y ejecutar ExecutorService de
- 3. ¿Cómo detener un Callable enviado a ExecutorService?
- 4. Java: ¿Es necesario sincronizar un ExecutorService?
- 5. Java ExecutorService pausa/reanudar un hilo específico
- 6. Java ExecutorService invokeAll() interrupción
- 7. ¿Cómo cambiar el nombre de los hilos en un ExecutorService?
- 8. ExecutorService en Java Servlet
- 9. ¿Cómo usar ExecutorService con Android AsyncTask?
- 10. CancelaciónExcepción al utilizar ExecutorService
- 11. Java Timer vs ExecutorService?
- 12. Cómo cerrar un jframe sin cerrar el programa principal
- 13. ¿Cómo cancelar un formulario cerrar en Cerrar evento?
- 14. Java ExecutorService callback on thread terminte
- 15. ExecutorService rendimiento lento multi hilo
- 16. Shutdown ExecutorService correctamente en webapp?
- 17. ¿Es seguro usar Singleton ExecutorService
- 18. ¿Cómo puedo obtener un Future <MyObject> sin utilizar ExecutorService?
- 19. Propagando ThreadLocal a un nuevo Thread obtenido de un ExecutorService
- 20. ¿Cuándo debería usar un CompletionService en un ExecutorService?
- 21. ¿Cómo cerrar un móvil Android programáticamente?
- 22. ¿Cómo cerrar un programa usando python?
- 23. ¿Cómo cerrar un hilo desde dentro?
- 24. Quiero cerrar un CFSocket
- 25. Java interject Objetos ejecutables en ExecutorService
- 26. Detener un bucle infinito en una tarea ExecutorService
- 27. ¿Hay alguna manera de hacer que un ExecutorService funcione recursivamente?
- 28. Cómo cerrar UIActionSheet automáticamente
- 29. OpenID. Cómo cerrar sesión
- 30. ¿Se debe cerrar un WriteStream?
Por favor marque la respuesta correcta como aceptadas – gonephishing