Ich habe eine Methode, die eine List
der Futures zurückgibt
List<Future<O>> futures = getFutures();
Jetzt möchte ich warten, bis entweder alle Futures erfolgreich verarbeitet wurden oder eine der Aufgaben, deren Ausgabe von einer Zukunft zurückgegeben wird, eine Ausnahme auslöst. Selbst wenn eine Aufgabe eine Ausnahme auslöst, macht es keinen Sinn, auf die anderen Zukünfte zu warten.
Einfacher Ansatz wäre zu
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;
}
}
}
Aber das Problem hier ist, wenn zum Beispiel die 4. Zukunft eine Ausnahme auslöst, dann werde ich unnötig warten, bis die ersten 3 Futures verfügbar sind.
Wie kann man das lösen? Wird der Countdown in irgendeiner Weise helfen? Ich kann Future nicht verwenden, isDone
da das Java-Dokument dies sagt
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
für jeden "Stapel" von Aufgaben eine Instanz erstellen, diese an ihn senden, dann den Dienst sofort herunterfahren und awaitTermination()
ihn vermutlich verwenden.
CountDownLatch
wenn Sie den Körper aller Ihrer Futures in a eingewickelt haben try..finally
, um sicherzustellen, dass der Riegel ebenfalls dekrementiert wird.