Bei der Nutzung von ExecutorService muss ein Entwickler möglicherweise die Ausführung anhalten, bis alle zugewiesenen Aufgaben abgeschlossen sind. Diese Untersuchung untersucht den einfachsten Ansatz zum Erreichen dieses Ziels.
Frage:
Führen Sie eine Vielzahl von Rechenaufgaben aus, eine pro Kern, und pausieren Sie die Ausführung, bis sie abgeschlossen sind. Die aktuelle Implementierung verwendet ExecutorService.execute() und es.wait(), ist jedoch mit einer IllegalMonitorStateException konfrontiert.
Antwort:
Verwenden Sie ExecutorService.invokeAll(), eine unkomplizierte Lösung das die gewünschte Funktionalität mit einer einzigen Zeile erreicht Code:
List<Callable<Object>> todo = new ArrayList<Callable<Object>>(singleTable.size()); for (DataTable singleTable: uniquePhrases) { todo.add(Executors.callable(new ComputeDTask(singleTable))); } List<Future<Object>> answers = es.invokeAll(todo);
invokeAll() pausiert die Ausführung, bis alle Aufgaben abgeschlossen sind, wodurch ein manuelles Herunterfahren undawaitTermination() überflüssig werden. Dieser Ansatz ist auf wiederverwendbare ExecutorService-Instanzen über mehrere Ausführungen hinweg ausgerichtet.
Weitere Informationen zu verwandten Themen finden Sie in diesen Referenzen:
Das obige ist der detaillierte Inhalt vonWie kann man mit ExecutorService effizient auf den Abschluss einer Aufgabe warten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!