Maison >Java >javaDidacticiel >Comment CompletionService peut-il être utilisé pour optimiser l'attente d'une liste de contrats à terme et gérer efficacement les exceptions ?
Optimisation de la liste de futurs en attente avec CompletionService
Lorsque vous travaillez avec une liste de futurs, il est essentiel d'attendre efficacement leur achèvement ou de gérer les exceptions pour éviter les retards inutiles.
Supposons que vous disposiez de la méthode suivante qui renvoie une liste de contrats à terme :
List<Future<O>> futures = getFutures();
Pour attendre la fin ou détecter des exceptions, une approche naïve pourrait être :
wait() { for(Future f : futures) { try { f.get(); } catch(Exception e) { //Specific exception handling //Exception in a future, stop waiting return; } } }
Cependant, cette approche attend chaque futur quelles que soient les exceptions des futurs précédents.
Une solution consiste à employer un CompletionService pour recevoir les contrats à terme dès qu'ils deviennent disponibles. Si une exception se produit, vous pouvez annuler d'autres tâches :
Executor executor = Executors.newFixedThreadPool(4); CompletionService<SomeResult> completionService = new ExecutorCompletionService<SomeResult>(executor); //Submit tasks for(int i = 0; i < 4; i++) { completionService.submit(() -> { ... return result; }); } int received = 0; boolean errors = false; while(received < 4 && !errors) { Future<SomeResult> resultFuture = completionService.take(); //Blocks if none available try { SomeResult result = resultFuture.get(); received++; ... //Process result } catch(Exception e) { //Log and set error flag errors = true; } }
Dans cette approche, les tâches sont soumises à l'exécuteur testamentaire et les tâches terminées sont reçues via le service d'achèvement. Si une exception se produit dans une tâche reçue, la boucle while se termine et vous pouvez annuler toutes les tâches restantes à l'aide de la méthode shutdownNow() de l'exécuteur.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!