Lors de l'utilisation d'ExecutorService, un développeur peut rencontrer le besoin de suspendre l'exécution jusqu'à ce que toutes les tâches assignées soient terminées. Cette enquête explore l'approche la plus simple pour atteindre cet objectif.
Question :
Exécuter une multitude de tâches de calcul, une par cœur, et suspendre l'exécution jusqu'à leur achèvement. L'implémentation actuelle utilise ExecutorService.execute() et es.wait(), mais fait face à une IllegalMonitorStateException.
Réponse :
Employez ExecutorService.invokeAll(), une solution simple qui accomplit la fonctionnalité souhaitée avec une seule ligne de code:
List<Callable<Object>> todo = new ArrayList<Callable<Object>>(singleTable.size()); for (DataTable singleTable: uniquePhrases) { todo.add(Executors.callable(new ComputeDTask(singleTable))); } List<Future<Object>> answers = es.invokeAll(todo);
invokeAll() suspend l'exécution jusqu'à ce que toutes les tâches soient terminées, rendant l'arrêt manuel et waitTermination() inutiles. Cette approche s'aligne sur les instances ExecutorService réutilisables sur plusieurs exécutions.
Pour une exploration plus approfondie des sujets connexes, consultez ces références :
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!