У мене є метод, який повертає 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;
}
}
}
Але проблема тут полягає в тому, якщо, наприклад, четверте майбутнє кине виняток, тоді я зайво чекатиму, коли будуть доступні перші 3 ф'ючерси.
Як це вирішити? Чи підрахує допомогу засувки будь-яким чином? Я не можу використовувати майбутнє, 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.
ExecutionService
для кожної "партії" завдань, подати їх, а потім негайно вимкнути службу і використовувати awaitTermination()
її, я думаю.
CountDownLatch
якщо ви загорнули тіло всіх своїх майбутніх у, try..finally
щоб переконатися, що засувка також зменшиться.