Mam metodę, która zwraca wartość Listprzyszłości
List<Future<O>> futures = getFutures();
Teraz chcę poczekać, aż wszystkie futures zostaną pomyślnie przetworzone lub którekolwiek z zadań, których dane wyjściowe zostaną zwrócone przez przyszłość, zgłosi wyjątek. Nawet jeśli jedno zadanie rzuca wyjątek, nie ma sensu czekać na inną przyszłość.
Byłoby proste podejście
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;
}
}
}
Ale problem polega na tym, że jeśli, na przykład, czwarta przyszłość generuje wyjątek, wtedy będę niepotrzebnie czekać, aż pierwsze 3 futures będą dostępne.
Jak to rozwiązać? Czy w jakikolwiek sposób odlicza przyswajanie? Nie mogę użyć Future, isDoneponieważ dokument java mówi
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.
ExecutionServicedla każdej „partii” zadań, przesłać je do niej, a następnie natychmiast zamknąć usługę i awaitTermination()jak przypuszczam użyć na niej.
CountDownLatchjeśli owinąłeś ciało wszystkich swoich przyszłości w a, try..finallyaby upewnić się, że zatrzask również zostanie zmniejszony.