Maison >Java >javaDidacticiel >Comment puis-je attendre efficacement que toutes les tâches soient terminées dans un ExecutorService ?

Comment puis-je attendre efficacement que toutes les tâches soient terminées dans un ExecutorService ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-10 16:01:11866parcourir

How Can I Efficiently Wait for All Tasks to Complete in an ExecutorService?

ExecutorService : attendre la fin des tâches

ExecutorService est un outil pratique pour une exécution efficace des tâches, mais faire une pause jusqu'à ce que toutes les tâches soient terminées peut être délicat. Examinons un problème courant et sa solution pratique.

Erreur d'attente()

L'extrait de code cité, qui utilise un ExecutorService à pool de threads fixe, expérimente une IllegalMonitorStateException lors de la tentative d'utilisation de es.wait(). Cela se produit car wait() est destiné à être utilisé avec des idiomes de synchronisation de threads spécifiques, et non avec ExecutorService.

Solution la plus simple : InvoqueAll()

ExecutorService offre une alternative plus simple pour dans ce but : InvoqueAll(). Cette méthode prend une collection de tâches appelables, les exécute en parallèle et se bloque jusqu'à ce que toutes les tâches soient terminées. Voici comment l'utiliser :

ExecutorService es = Executors.newFixedThreadPool(2);
List<Callable<Object>> todo = new ArrayList<>(uniquePhrases.size());

for (DataTable singleTable: uniquePhrases) { 
    todo.add(Executors.callable(new ComputeDTask(singleTable))); 
}

List<Future<Object>> answers = es.invokeAll(todo);

invokeAll() renvoie une liste d'objets Future, chacun représentant une tâche individuelle. Une fois que toutes les tâches sont terminées, l'accès à isDone() de n'importe quel Future retournera true.

Avantages de InvokeAll()

  • Bloque jusqu'à ce que toutes les tâches soient terminées.
  • Évite l'arrêt et la synchronisation manuels.
  • Permet la réutilisation d'ExecutorService pour plusieurs tâches cycles.

D'autres méthodes

  • shutdown() et waitTermination() peuvent également être utilisées, mais elles nécessitent une gestion d'arrêt manuelle.
  • submit(Callable) peut être utilisé pour la soumission de tâches individuelles, mais cela nécessite un suivi manuel de la tâche achèvement.

N'oubliez pas que EnsureAll() nécessite que vos tâches implémentent Callable. Si ComputeDTask est un Runnable, enveloppez-le comme indiqué dans l'extrait de code ou utilisez Executors.callable().

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