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
Freigeben: 2024-12-03 12:28:10
Original
187 Leute haben es durchsucht

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);
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage