Maison > Java > javaDidacticiel > le corps du texte

Comment CompletionService peut-il être utilisé pour optimiser l'attente d'une liste de contrats à terme et gérer efficacement les exceptions ?

Patricia Arquette
Libérer: 2024-10-25 19:58:29
original
934 Les gens l'ont consulté

How can CompletionService be used to optimize waiting for a list of futures and handle exceptions efficiently?

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

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

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

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!

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!