Ich habe einen Code, wo 4 Threads zur gleichen Zeit ausgeführt werden. Ich möchte warten, bis alle diese 4 Threads fertig sind. Und erst danach, um den App-Flow fortzusetzen.ExecutorService shutdown() wartet nicht, bis alle Threads beendet sind
Ich habe versucht, zwei Ansätze:
Thread#join()
dieser Ansatz funktioniert wie erwartet. Der Code, der nachjoin()
kommt, wird erst ausgeführt, nachdem alle Threads beendet sind.ExecutorService#shutdown()
, ermöglicht diese Technik die Ausführung von Code, der nachshutdown()
kommt, auch wenn nicht alle Threads beendet sind.
Codebeispiel:
ExecutorService service = Executors.newFixedThreadPool(cpuCoresNum);
for (int i = 0; i < cpuCoresNum; i++) {
service.submit(() -> {
try {
foo(); // some long execution function
} catch (Exception e) {
e.printStackTrace();
}
});
}
service.shutdown();
System.out.println("We're done! All threads are finished!");
Meine Frage:
- Warum
submit()
undshutdown()
nicht warten, bis alle Threads und Drucke fertig werden «Wir sind fertig! Alle Gewinde sind fertig! » gleich nach dem Anruf vonservice.shutdown();
?
tun Meine Themen ändern sich nicht Geben Sie einen beliebigen Wert zurück, daher scheint die zweite Option relevanter zu sein. –
@MikeB. 'submit' gibt ein' Future' zurück, unabhängig davon, ob Sie ein 'Runnable' oder' Callable' übergeben. In beiden Fällen wartet der Aufruf von 'get()' auf einem 'Future' darauf, dass der Thread seine Arbeit beendet. Bevor Sie 'awaitTermination' aufrufen, müssen Sie' shutdown' aufrufen. –
'awaistTermination()' benötigt ein Zeitlimit, um anzugeben, aber in meinem Fall weiß ich nicht, wie viel Zeit es dauern sollte, also welchen Wert ich als 'Timeout' angeben muss, um sicherzustellen, dass alle Threads beendet sind richtig und nicht gezwungen, wegen "Timeout" zu stoppen? Aus der Dokumentation: * «Blockiert, bis alle Tasks nach einer Shutdown-Anforderung ausgeführt wurden oder das Zeitlimit überschritten wird oder der aktuelle Thread unterbrochen wird **, je nachdem, was zuerst eintritt **.» * –