Maison > Java > javaDidacticiel > le corps du texte

Comment puis-je gérer efficacement les erreurs et la résiliation anticipée lorsque je travaille avec Futures ?

Linda Hamilton
Libérer: 2024-10-26 10:10:29
original
413 Les gens l'ont consulté

How Can I Efficiently Handle Errors and Early Termination When Working with Futures?

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 :

  1. Utiliser un CompletionService :

    • Créez un CompletionService pour recevoir les contrats à terme dès qu'ils deviennent disponibles.
    • Soumettez des tâches à l'aide d'objets appelables qui encapsulent le traitement.
  2. Surveiller les contrats à terme de manière séquentielle :

    • Utilisez une boucle pour parcourir les contrats à terme reçus du CompletionService.
    • Tenter de récupérer le résultat de chaque futur en utilisant Future.get().
    • Si un futur génère une exception, définissez un indicateur pour indiquer qu'une erreur s'est produite.
  3. Annuler Tâches restantes :

    • Une fois qu'une erreur a été détectée, annulez toutes les tâches restantes pour éviter une attente inutile.

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!