Tôi có một phương thức trả về một List
tương lai
List<Future<O>> futures = getFutures();
Bây giờ tôi muốn đợi cho đến khi tất cả các hợp đồng tương lai được xử lý thành công hoặc bất kỳ nhiệm vụ nào có đầu ra được trả về bởi một tương lai sẽ ném ra một ngoại lệ. Ngay cả khi một nhiệm vụ ném ra một ngoại lệ, không có lý do gì để chờ đợi các tương lai khác.
Cách tiếp cận đơn giản sẽ là
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;
}
}
}
Nhưng vấn đề ở đây là, ví dụ, nếu tương lai thứ 4 ném ra một ngoại lệ, thì tôi sẽ chờ đợi một cách không cần thiết cho 3 tương lai đầu tiên có sẵn.
Làm thế nào để giải quyết điều này? Sẽ đếm ngược giúp đỡ bằng cách nào? Tôi không thể sử dụng Tương lai isDone
vì tài liệu java nói
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
cho mỗi "lô" nhiệm vụ, gửi chúng cho nó, sau đó tắt ngay dịch vụ và sử dụng awaitTermination()
nó.
CountDownLatch
nếu bạn bọc cơ thể của tất cả các tương lai của bạn trong một try..finally
để đảm bảo rằng chốt cũng bị giảm.