J'ai une méthode qui renvoie un List
des futurs
List<Future<O>> futures = getFutures();
Maintenant, je veux attendre que tous les futurs soient traités avec succès ou que l'une des tâches dont la sortie est retournée par un futur lève une exception. Même si une tâche lève une exception, il ne sert à rien d'attendre les autres futurs.
Une approche simple serait de
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;
}
}
}
Mais le problème ici est que si, par exemple, le 4ème futur lève une exception, alors j'attendrai inutilement que les 3 premiers futurs soient disponibles.
Comment résoudre ça? Le compte à rebours du verrou vous aidera-t-il d'une manière ou d'une autre? Je ne peux pas utiliser Future isDone
car le document java dit
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
pour chaque "lot" de tâches, les lui soumettre, puis arrêter immédiatement le service et l'utiliser awaitTermination()
, je suppose.
CountDownLatch
si vous enveloppez le corps de tous vos futurs dans un try..finally
pour vous assurer que le loquet est également décrémenté.