У меня есть метод, который возвращает List
фьючерсов
List<Future<O>> futures = getFutures();
Теперь я хочу подождать, пока все фьючерсы будут успешно завершены или какие-либо из задач, выход которых будет возвращен будущим, выдает исключение. Даже если одна задача выдает исключение, нет смысла ждать других фьючерсов.
Простым подходом было бы
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;
}
}
}
Но проблема здесь заключается в том, что, например, 4-е будущее выдает исключение, тогда я буду ждать, когда первые 3 фьючерса будут доступны.
Как это решить? Будет ли обратная помощь защелками в любом случае? Я не могу использовать Future isDone
, потому что в 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.