En Java, lorsque l'on travaille avec des futurs, il peut être nécessaire d'attendre qu'une liste de tâches futures soit terminée tout en gérant les exceptions qui surviennent. Une approche simple consisterait à attendre séquentiellement chaque futur et à vérifier les exceptions potentielles. Cependant, cette approche souffre de problèmes d'efficacité si une exception se produit plus tôt dans la liste, car les tâches suivantes seraient toujours attendues inutilement.
Pour résoudre ce problème, une solution alternative exploite la classe CompletionService. Le CompletionService reçoit les contrats à terme dès qu'ils deviennent disponibles et permet une résiliation anticipée si une exception est rencontrée.
Un exemple de la façon de mettre en œuvre cette approche est fourni ci-dessous :
<code class="java">Executor executor = Executors.newFixedThreadPool(4); CompletionService<SomeResult> completionService = new ExecutorCompletionService<>(executor); // 4 tasks for (int i = 0; i < 4; i++) { completionService.submit(new Callable<SomeResult>() { public SomeResult call() { // ... task implementation 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++; // ... do something with the result } catch (Exception e) { // Log the exception errors = true; } } // Potentially consider canceling any still running tasks if errors occurred</code>
En utilisant le CompletionService , vous pouvez attendre efficacement que les tâches futures soient terminées tout en gérant rapidement les exceptions.
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!