Mam metodę, która zwraca wartość List
przyszł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, isDone
ponieważ 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.
ExecutionService
dla każdej „partii” zadań, przesłać je do niej, a następnie natychmiast zamknąć usługę i awaitTermination()
jak przypuszczam użyć na niej.
CountDownLatch
jeśli owinąłeś ciało wszystkich swoich przyszłości w a, try..finally
aby upewnić się, że zatrzask również zostanie zmniejszony.