Saya memiliki metode yang mengembalikan masa List
depan
List<Future<O>> futures = getFutures();
Sekarang saya ingin menunggu sampai semua futures selesai diproses dengan sukses atau salah satu tugas yang outputnya dikembalikan oleh pelemparan masa depan. Bahkan jika satu tugas melempar pengecualian, tidak ada gunanya menunggu untuk masa depan lainnya.
Pendekatan yang sederhana adalah dengan
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;
}
}
}
Tapi masalahnya di sini adalah jika, misalnya, 4 masa depan melempar pengecualian, maka saya akan menunggu tidak perlu untuk 3 berjangka pertama yang akan tersedia.
Bagaimana cara mengatasinya? Apakah menghitung mundur kait akan membantu? Saya tidak dapat menggunakan Masa Depan isDone
karena kata java doc
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
untuk setiap "batch" tugas, mengirimkannya ke sana, lalu segera mematikan layanan dan menggunakannya awaitTermination()
, saya kira.
CountDownLatch
jika Anda membungkus tubuh semua masa depan Anda dalam try..finally
untuk memastikan kaitnya juga berkurang.