У меня есть код, в котором одновременно выполняются 4 потока. Я хочу дождаться завершения всех этих 4 потоков. И только после этого продолжать аппоток.
Я пробовал два подхода:
Thread#join()
< /a>, этот подход работает так, как ожидалось. Код, который идет послеjoin()
, выполняется только после завершения всех потоков.ExecutorService#shutdown()
, этот метод позволяет выполнять код, который идет послеshutdown()
, даже если не все потоки завершены.
Пример кода:
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!");
Мой вопрос:
- Почему
submit()
иshutdown()
не дождутся завершения всех потоков и не напечатают «Готово! Все потоки завершены!» сразу после вызоваservice.shutdown();
?