Maison >Java >javaDidacticiel >Comment attendre efficacement la fin de toutes les tâches ExecutorService ?

Comment attendre efficacement la fin de toutes les tâches ExecutorService ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-03 12:28:10191parcourir

How to Efficiently Wait for All ExecutorService Tasks to Finish?

En attente de la fin des tâches ExecutorService

Question :

Comment peut-on attendre efficacement toutes les tâches soumises à un ExecutorService pour être complétées ? Le cas d'utilisation spécifique implique des tâches de calcul exécutées sur plusieurs cœurs.

Contexte :

L'extrait de code donné utilise ExecutorService.wait(), mais il échoue avec une IllegalMonitorStateException. Malgré une exécution réussie de la tâche, l'opération d'attente semble rencontrer un problème.

Réponse :

ExecutorService.invokeAll()

La solution recommandée consiste à utiliser ExecutorService.invokeAll(). Il fournit une méthode simple pour attendre que toutes les tâches soient terminées. Voici un exemple de code modifié :

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

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

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

invokeAll() Behavior

invokeAll() bloquera jusqu'à ce que toutes les tâches soient terminées. La collection de réponses résultante contient des Futures représentant le statut de chaque tâche et la valeur de retour potentielle. Par défaut, encapsulés par Executors.callable(), ces Futures renverront null. Cependant, vous pouvez modifier ComputeDTask pour implémenter Callable pour fournir des valeurs de retour significatives.

Avantages :

L'utilisation de EnsureAll() simplifie le code et évite la condition de concurrence potentielle associée à wait(). Il permet également la réutilisation d'ExecutorService pour plusieurs cycles.

Questions connexes :

Pour plus de précisions, considérez les questions connexes suivantes sur Stack Overflow :

  • [Comment attendre que tous les sujets soient terminés finish](https://stackoverflow.com/questions/13796491/how-to-wait-for-all-threads-to-finish)
  • [Valeurs de retour des threads Java](https://stackoverflow .com/questions/11937661/return-values-from-java-threads)
  • [invokeAll() je ne suis pas disposé à accepter une collection>](https://stackoverflow.com/questions/24168027/invokeall-not-willing-to-accept-a-collectioncallablet)
  • [Est-ce que je besoin de synchroniser ?](https://stackoverflow.com/questions/546386/do-i-need-to-synchronize)

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