Espere hasta que todos los hilos terminen su trabajo en Java.
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)?
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.
Puedes hacerlo join
con los hilos. La unión se bloquea hasta que se completa el hilo.
for (Thread thread : threads) {
thread.join();
}
Tenga en cuenta que join
arroja 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).
Eche un vistazo a varias soluciones.
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.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?
- 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í
ForkJoinPool o newWorkStealingPool() en Ejecutores
Iterar a través de todos los objetos futuros creados después de enviarlos a
ExecutorService
Fuente: varios enlaces de docs.oracle.com