multiple - java executor thread pool
Thread.join() equivalente en ejecutor (4)
Tengo una pregunta de novato. Tengo este codigo
public class Main
{
public static void main(String[] args) throws InterruptedException
{
// TODO Auto-generated method stub
IntHolder aHolder=new IntHolder();
aHolder.Number=0;
IncrementorThread A= new IncrementorThread(1, aHolder);
IncrementorThread B= new IncrementorThread(2, aHolder);
IncrementorThread C= new IncrementorThread(3, aHolder);
A.start();
B.start();
C.start();
A.join();
B.join();
C.join();
System.out.println("All threads completed...");
}
}
Que esperará a que todos los hilos para completar. Si uso Executors
como este:
public class Main
{
public static void main(String[] args)
{
// TODO Auto-generated method stub
IntHolder aHolder=new IntHolder();
aHolder.number=0;
IncrementalRunable A= new IncrementalRunable(1, aHolder);
IncrementalRunable B= new IncrementalRunable(2, aHolder);
IncrementalRunable C= new IncrementalRunable(3, aHolder);
ExecutorService exec = Executors.newFixedThreadPool(3);
exec.execute(A);
exec.execute(B);
exec.execute(C);
//Don''t know what to do here
System.out.println("All threads completed...");
}
}
¿Cómo puedo suspender el subproceso principal para esperar a que todos los subprocesos del ejecutor finalicen, es decir, se deben imprimir "Todos los subprocesos completados ..." después de que todos los subprocesos hayan realizado su trabajo?
Intenta trabajar con el grupo de subprocesos de esta manera.
executor.shutdown();
executor.awaitTermination(MAX_PRIORITY, TimeUnit.HOURS);
No debe utilizar un ejecutor como este si desea esperar a que finalicen las tareas. ¿Qué sucede si no desea / no puede cerrar su ejecutor de grupo de subprocesos? Esta es una forma más recomendada:
ExecutorService exec = Executors.newFixedThreadPool(3);
Collection<Future<?>> tasks = new LinkedList<Future<?>>();
Future<T> future = exec.submit(A);
tasks.add(future);
future = exec.submit(B);
tasks.add(future);
future = exec.submit(C);
tasks.add(future);
// wait for tasks completion
for (Future<?> currTask : tasks) {
try {
currTask.get();
} catch (Throwable thrown) {
Logger.error(thrown, "Error while waiting for thread completion");
}
}
exec.shutdown();
// Wait until all threads are finish
exec.awaitTermination();
executor.shutdown();
while (!executor.awaitTermination(24L, TimeUnit.HOURS)) {
System.out.println("Not yet. Still waiting for termination");
}
Use la combinación shutdown() + awaitTermination()
.
EDITAR:
Basado en el comentario de @Lital.
List<Callable<Object>> calls = new ArrayList<Callable<Object>>();
calls.add(Executors.callable(new IncrementalRunable(1, aHolder)));
calls.add(Executors.callable(new IncrementalRunable(2, aHolder)));
calls.add(Executors.callable(new IncrementalRunable(3, aHolder)));
List<Future<Object>> futures = executor.invokeAll(calls);
NOTA: invokeAll()
no regresará hasta que todas las tareas se hayan completado (ya sea fallando o completando la ejecución exitosa).