2009-10-13 17 views
21

Estoy trabajando en los ejecutores en Java para ejecutar simultáneamente más hilos a la vez. Tengo un conjunto de Objetos Ejecutables y lo asigno a los Exceutors. El Ejecutor está trabajando bien y todo está bien. Pero después de que todas las tareas se ejecutan en el grupo, el programa Java no se termina, creo que el Ejecutor toma algo de tiempo matar los hilos. Por favor, que alguien me ayude a reducir el tiempo empleado por el ejecutor después de ejecutar todas las tareas.Cómo detener la ejecución de Execution ThreadPool en java?

Respuesta

22

La clase ExecutorService tiene 2 métodos solo para esto: shutdown() y shutdownNow().

Después de usar el método shutdown(), puede llamar al awaitTermination() para bloquear hasta que se hayan completado todas las tareas iniciadas. Incluso puede proporcionar un tiempo de espera para evitar esperar para siempre.

Es posible que desee hacer clic en algunos de estos enlaces que estoy proporcionando. Van directamente a los documentos donde usted puede leer estas cosas usted mismo.

+0

Cómo puedo asegurar que todas las tareas están comprometidas, necesito todas las tareas deben confirmar su ejecución – Rajapandian

+1

@Rajapandian La definición de apagado es que espera a que se completen todas las tareas, pero no permite que comiencen las nuevas. ¿Cómo no hace eso lo que quieres? –

+1

por favor alguien me diga por qué mi programa java toma tiempo para detener la ejecución incluso después de que el ejecutor termine toda su tarea. – Rajapandian

9

executor.shutdown() con awaitTermination (tiempo de espera) no mata los hilos. (es decir), si su tarea ejecutable se encuentra dentro de un ciclo de sondeo, no mata la tarea. Todo lo que hace es interrumpir sus tareas ejecutables cuando se alcanza el tiempo de espera. Por lo tanto, en el código de su clase ejecutable, si se espera de alguna condición, es posible que desee cambiar la condición de que,

while (flagcondition && !Thread.currentThread().isInterrupted()) {} 

Esto asegura que se detiene la tarea cuando el hilo se interrumpe en el bucle while termina. Alternativamente, es posible que desee capturar la excepción interrumpida y establecer flag = false en el bloque catch para finalizar el hilo.

try { 
    // do some stuff and perform a wait that might throw an InterruptedException 
} catch (InterruptedException e) { 
    flagcondition = false; 
} 

Es posible que también desee utilizar un generador de perfiles para examinar por qué algunos subprocesos no se han completado.

Cuestiones relacionadas