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 ?

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

Patricia Arquette
Patricia Arquetteoriginal
2024-10-25 19:58:291016parcourir

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();

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!

Déclaration:
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