Tengo un método que devuelve un List
futuro
List<Future<O>> futures = getFutures();
Ahora quiero esperar hasta que todos los futuros se terminen de procesar con éxito o cualquiera de las tareas cuyo resultado sea devuelto por un futuro arroje una excepción. Incluso si una tarea arroja una excepción, no tiene sentido esperar a los otros futuros.
Un enfoque simple sería
wait() {
For(Future f : futures) {
try {
f.get();
} catch(Exception e) {
//TODO catch specific exception
// this future threw exception , means somone could not do its task
return;
}
}
}
Pero el problema aquí es si, por ejemplo, el 4to futuro arroja una excepción, entonces esperaré innecesariamente a que estén disponibles los primeros 3 futuros.
¿Cómo resolver esto? ¿La cuenta regresiva ayudará con el pestillo de alguna manera? No puedo usar Future isDone
porque el documento de Java dice
boolean isDone()
Returns true if this task completed. Completion may be due to normal termination, an exception, or cancellation -- in all of these cases, this method will return true.
ExecutionService
cada "lote" de tareas, enviarlas a él, luego inmediatamente cerrar el servicio y usarlo awaitTermination()
, supongo.
CountDownLatch
si envolviste el cuerpo de todos tus futuros en una try..finally
para asegurarte de que el pestillo también se reduzca.