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
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 :
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!