Espere hasta que todos los hilos terminen su trabajo en Java.

Resuelto Ariyan asked hace 12 años • 17 respuestas

Estoy escribiendo una aplicación que tiene 5 subprocesos que obtienen información de la web simultáneamente y completan 5 campos diferentes en una clase de búfer.
Necesito validar los datos del búfer y almacenarlos en una base de datos cuando todos los subprocesos hayan terminado su trabajo.
¿Cómo puedo hacer esto (recibir una alerta cuando todos los hilos hayan terminado su trabajo)?

Ariyan avatar Oct 29 '11 20:10 Ariyan
Aceptado

El enfoque que tomo es utilizar un ExecutorService para administrar grupos de subprocesos.

ExecutorService es = Executors.newCachedThreadPool();
for(int i=0;i<5;i++){
    es.execute(new Runnable() { /*  your task */ });
}
es.shutdown();
boolean finished = es.awaitTermination(1, TimeUnit.MINUTES);
// all tasks have finished or the time has been reached.
Peter Lawrey avatar Oct 29 '2011 14:10 Peter Lawrey

Puedes hacerlo joincon los hilos. La unión se bloquea hasta que se completa el hilo.

for (Thread thread : threads) {
    thread.join();
}

Tenga en cuenta que joinarroja un InterruptedException. Tendrás que decidir qué hacer si eso sucede (por ejemplo, intentar cancelar los otros hilos para evitar que se realice trabajo innecesario).

Mark Byers avatar Oct 29 '2011 13:10 Mark Byers

Eche un vistazo a varias soluciones.

  1. join()La API se introdujo en las primeras versiones de Java. Algunas buenas alternativas están disponibles con este paquete simultáneo desde la versión JDK 1.5.

  2. Servicio Ejecutor#invokeAll()

Ejecuta las tareas dadas y devuelve una lista de futuros que mantienen su estado y resultados cuando todo se completa.

Consulte esta pregunta SE relacionada para ver un ejemplo de código:

¿Cómo utilizar invokeAll() para permitir que todos los grupos de subprocesos hagan su tarea?

  1. cuenta atrás

Una ayuda de sincronización que permite que uno o más subprocesos esperen hasta que se complete un conjunto de operaciones que se realizan en otros subprocesos.

Un CountDownLatch se inicializa con un recuento determinado. Los métodos de espera se bloquean hasta que el recuento actual llega a cero debido a las invocaciones del countDown()método, después de lo cual todos los subprocesos en espera se liberan y cualquier invocación posterior de espera regresa inmediatamente. Este es un fenómeno de una sola vez: el conteo no se puede restablecer. Si necesita una versión que restablezca el recuento, considere usar CyclicBarrier .

Consulte esta pregunta para conocer el uso de CountDownLatch aquí

  1. ForkJoinPool o newWorkStealingPool() en Ejecutores

  2. Iterar a través de todos los objetos futuros creados después de enviarlos aExecutorService

Fuente: varios enlaces de docs.oracle.com

Ravindra babu avatar Apr 22 '2016 15:04 Ravindra babu