Heim >Java >javaLernprogramm >Wie kann man effizient auf den Abschluss aller ExecutorService-Aufgaben warten?
Warten auf den Abschluss von ExecutorService-Aufgaben
Frage:
Wie kann man effizient warten? Alle Aufgaben, die an einen ExecutorService übermittelt werden, um sie abzuschließen? Der spezifische Anwendungsfall umfasst Rechenaufgaben, die auf mehreren Kernen ausgeführt werden.
Hintergrund:
Das angegebene Codefragment verwendet ExecutorService.wait(), schlägt jedoch mit einer IllegalMonitorStateException fehl. Trotz erfolgreicher Aufgabenausführung scheint beim Wartevorgang ein Problem aufgetreten zu sein.
Antwort:
ExecutorService.invokeAll()
Die empfohlene Lösung ist die Verwendung von ExecutorService.invokeAll(). Es bietet eine einfache Möglichkeit, auf den Abschluss aller Aufgaben zu warten. Hier ist ein modifiziertes Codebeispiel:
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()-Verhalten
invokeAll() blockiert, bis alle Aufgaben abgeschlossen sind. Die resultierende Antwortsammlung enthält Futures, die den Status jeder Aufgabe und den potenziellen Rückgabewert darstellen. Standardmäßig geben diese Futures, umschlossen von Executors.callable(), null zurück. Sie können ComputeDTask jedoch ändern, um Callable
Vorteile:
Die Verwendung von invokeAll() vereinfacht den Code und vermeidet die potenzielle Race-Bedingung, die mit wait() verbunden ist. Es ermöglicht auch die Wiederverwendbarkeit des ExecutorService für mehrere Zyklen.
Verwandte Fragen:
Berücksichtigen Sie zur weiteren Klärung die folgenden verwandten Fragen zum Stapelüberlauf:
Das obige ist der detaillierte Inhalt vonWie kann man effizient auf den Abschluss aller ExecutorService-Aufgaben warten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!