Attente de résiliation anticipée pour une liste de futurs
Lorsque vous traitez des tâches asynchrones représentées par des futurs, il est souvent crucial d'attendre que tous les traitements soient terminés. terminé ou une erreur se produit. Cependant, il n'est pas souhaitable d'attendre inutilement que toutes les tâches soient terminées, même après qu'une erreur s'est produite.
Pour résoudre ce problème, envisagez les étapes suivantes :
Utiliser un CompletionService :
Surveiller les contrats à terme de manière séquentielle :
Annuler Tâches restantes :
Voici un exemple qui démontre cette approche :
<code class="java">Executor executor = Executors.newFixedThreadPool(4); CompletionService<SomeResult> completionService = new ExecutorCompletionService<SomeResult>(executor); // 4 tasks for(int i = 0; i < 4; i++) { completionService.submit(new Callable<SomeResult>() { public SomeResult call() { // Processing code return result; } }); } int received = 0; boolean errors = false; while(received < 4 && !errors) { Future<SomeResult> resultFuture = completionService.take(); // Blocks until available try { SomeResult result = resultFuture.get(); received ++; // Process the result } catch(Exception e) { // Log or handle the error errors = true; } if (errors) { // Cancel any remaining tasks executor.shutdown(); break; } }</code>
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!