Maison >Java >javaDidacticiel >Comment puis-je attendre efficacement que toutes les tâches soient terminées dans un 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()
D'autres méthodes
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!