Heim >Java >javaLernprogramm >Wie kann ich sicherstellen, dass alle Aufgaben abgeschlossen sind, bevor ich mit einem ExecutorService fortfahre?
ExecutorService – Eine Lösung für das Warten auf den Abschluss einer Aufgabe
Wenn Sie mit einer großen Anzahl von Rechenaufgaben arbeiten, die gleichzeitig ausgeführt werden müssen, ist dies der Fall Es ist wichtig, über einen Mechanismus zu verfügen, der darauf wartet, dass alle Aufgaben abgeschlossen sind. Dadurch wird sichergestellt, dass nachfolgende Aktionen erst ausgeführt werden können, nachdem alle Aufgaben abgeschlossen wurden.
In Ihrem Beispiel, in dem Sie versuchen, ExecutorService.wait() zu verwenden, um dies zu erreichen, stoßen Sie auf eine IllegalMonitorStateException. Dieser Fehler tritt auf, weil wait() beim Warten auf die intrinsische Sperre eines Objekts verwendet werden soll, was in diesem Szenario nicht anwendbar ist.
Die einfachste Lösung besteht darin, ExecutorService.invokeAll() zu nutzen. Diese Methode nimmt eine Sammlung aufrufbarer Aufgaben, führt sie parallel aus und gibt eine Liste zukünftiger Objekte zurück. Jede Zukunft stellt das Ergebnis einer bestimmten Aufgabe dar. Standardmäßig blockiert invokeAll(), bis alle Aufgaben abgeschlossen sind, bevor die Liste der zukünftigen Objekte zurückgegeben wird.
So können Sie Ihren Code ändern:
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);
In diesem aktualisierten Code ExecutorService .invokeAll() wartet, bis alle Aufgaben abgeschlossen sind, sodass Sie sicher mit Ihren nachfolgenden Aktionen fortfahren können.
Das obige ist der detaillierte Inhalt vonWie kann ich sicherstellen, dass alle Aufgaben abgeschlossen sind, bevor ich mit einem ExecutorService fortfahre?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!