Ho un metodo che restituisce un List
futuro
List<Future<O>> futures = getFutures();
Ora voglio aspettare fino a quando tutti i futures non sono stati elaborati correttamente o una delle attività il cui output viene restituito da un futuro genera un'eccezione. Anche se un'attività genera un'eccezione, non ha senso aspettare gli altri futuri.
Un approccio semplice sarebbe
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;
}
}
}
Ma il problema qui è se, ad esempio, il 4 ° futuro genera un'eccezione, quindi aspetterò inutilmente che i primi 3 futuri siano disponibili.
Come risolverlo? Il conto alla rovescia aiuterà in qualche modo? Non riesco a usare Future isDone
perché dice il documento java
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
per ogni "batch" di attività, inviarle ad essa, quindi chiudere immediatamente il servizio e utilizzarlo awaitTermination()
su di esso, suppongo.
CountDownLatch
se avessi avvolto il corpo di tutti i tuoi futures in a try..finally
per assicurarti che anche il chiavistello venga diminuito.