Eu tenho um método que retorna um List
dos futuros
List<Future<O>> futures = getFutures();
Agora, quero esperar até que todos os futuros sejam processados com êxito ou que qualquer uma das tarefas cuja saída seja retornada por um futuro gere uma exceção. Mesmo que uma tarefa gere uma exceção, não faz sentido esperar pelos outros futuros.
Uma abordagem simples seria
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;
}
}
}
Mas o problema aqui é se, por exemplo, o quarto futuro lançar uma exceção, esperarei desnecessariamente os 3 primeiros futuros disponíveis.
Como resolver isso? A contagem decrescente trava a ajuda de alguma maneira? Não consigo usar o Future isDone
porque o documento java diz
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
para cada "lote" de tarefas, enviá-las a ele e, em seguida, desligar imediatamente o serviço e usá awaitTermination()
-lo, suponho.
CountDownLatch
se você envolveu o corpo de todos os seus futuros em um try..finally
para garantir que a trava também diminua.