Maison >Java >javaDidacticiel >Comment puis-je m'assurer que toutes les tâches sont terminées avant de procéder à un ExecutorService ?
ExecutorService - Une solution pour attendre l'achèvement des tâches
Lorsque vous travaillez avec un grand nombre de tâches de calcul qui doivent être exécutées simultanément, il est Il est important d'avoir un mécanisme en place pour attendre que toutes les tâches soient terminées. Cela garantit que les actions ultérieures ne peuvent être effectuées qu'une fois toutes les tâches terminées.
Dans votre exemple, où vous essayez d'utiliser ExecutorService.wait() pour y parvenir, vous rencontrez une IllegalMonitorStateException. Cette erreur se produit car wait() est censé être utilisé lors de l'attente du verrou intrinsèque d'un objet, ce qui n'est pas applicable dans ce scénario.
La solution la plus simple consiste à exploiter ExecutorService.invokeAll(). Cette méthode prend une collection de tâches Callable, les exécute en parallèle et renvoie une liste d'objets Future. Chaque Future représente le résultat d'une tâche spécifique. Par défaut, invoqueAll() bloquera jusqu'à ce que toutes les tâches soient terminées avant de renvoyer la liste des objets Future.
Voici comment modifier votre code :
ExecutorService es = Executors.newFixedThreadPool(2); List<Callable<Object>> tasks = new ArrayList<>(); for (DataTable singleTable : uniquePhrases) { tasks.add(Executors.callable(new ComputeDTask(singleTable))); } List<Future<Object>> results = es.invokeAll(tasks);
Dans ce code mis à jour, ExecutorService .invokeAll() attendra que toutes les tâches soient terminées, vous permettant de poursuivre vos actions ultérieures en toute confiance.
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!