ฉันมีวิธีที่คืนค่า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.
ExecutionService
งาน "แบทช์" ทุกงานส่งงานนั้นจากนั้นปิดบริการทันทีและใช้งานawaitTermination()
ตามที่ฉันคิด
CountDownLatch
ถ้าคุณหุ้มร่างของอนาคตทั้งหมดไว้ใน a try..finally
เพื่อให้แน่ใจว่าสลักจะลดลงเช่นกัน