Heim >Java >javaLernprogramm >Wie kann man effizient auf den Abschluss aller ExecutorService-Aufgaben warten?

Wie kann man effizient auf den Abschluss aller ExecutorService-Aufgaben warten?

Barbara Streisand
Barbara StreisandOriginal
2024-12-03 12:28:10199Durchsuche

How to Efficiently Wait for All ExecutorService Tasks to Finish?

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 zu implementieren. um aussagekräftige Rückgabewerte bereitzustellen.

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:

  • [So warten Sie, bis alle Threads fertig sind fertig](https://stackoverflow.com/questions/13796491/how-to-wait-for-all-threads-to-finish)
  • [Werte von Java zurückgeben Threads](https://stackoverflow.com/questions/11937661/return-values-from-java-threads)
  • [invokeAll() ist nicht bereit, a zu akzeptieren Collection>](https://stackoverflow.com/questions/24168027/invokeall-not-willing-to-accept-a-collectioncallablet)
  • [Muss ich synchronisieren?](https://stackoverflow.com/questions/546386/do-i-need-to-synchronize)

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn