Ben List
vadeli bir döndüren bir yöntem var
List<Future<O>> futures = getFutures();
Şimdi, tüm vadeli işlemlerin başarıyla işlenmesini veya geleceği tarafından geri döndürülen görevlerin herhangi birini bir istisna atana kadar beklemek istiyorum. Bir görev bir istisna atsa bile, diğer gelecekleri beklemenin bir anlamı yoktur.
Basit bir yaklaşım
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;
}
}
}
Ancak buradaki sorun, örneğin 4. gelecek bir istisna atarsa, ilk 3 geleceğin mevcut olmasını gereksiz yere bekleyeceğim.
Bunu nasıl çözebilirim? Geri sayım mandalı herhangi bir şekilde yardımcı olur mu? isDone
Java doc diyor ki Future’u kullanamıyorum
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
Her "toplu iş" için bir örnek yapabilir , bunları gönderebilir, sonra derhal hizmeti kapatabilir ve awaitTermination()
üzerinde kullanabilirsiniz .
CountDownLatch
tüm geleceklerinizin gövdesini bir sarılmışsa kullanabilirsiniz try..finally
.