#java #multithreading
#java #многопоточность
Вопрос:
Я пытаюсь понять, как работает ScheduledExecutorService. Я написал этот простой тест:
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(10);
executorService.scheduleAtFixedRate(() -> {
try {
System.out.println("Test " Thread.currentThread().getId());
Thread.sleep(10000);
System.out.println("End " Thread.currentThread().getId());
} catch (Exception ex) {
}
}, 0, 100, TimeUnit.MILLISECONDS);
Я вижу следующее, напечатанное на консоли:
Test 19
End 19
Test 19
End 19
Test 21
End 21
И так далее. Разве исполнитель не должен планировать и запускать новый поток еще до завершения первого потока? Почему потоки запускаются один за другим, если размер основного пула равен 10. не должны ли 10 потоков выполняться вместе.
Ответ №1:
Повторяющаяся задача не перекрывается, поэтому первый вызов должен быть завершен до запуска следующего:
Последовательные выполнения задачи, запланированные с помощью scheduleAtFixedRate или scheduleWithFixedDelay, не перекрываются. Хотя разные выполнения могут выполняться разными потоками, последствия предыдущих выполнений происходят раньше, чем последствия последующих.
Если какое-либо выполнение этой задачи занимает больше времени, чем ее период, то последующие выполнения могут начаться с опозданием, но не будут выполняться одновременно.
Комментарии:
1. Спасибо, но какова тогда цель core pool? Будет ли это иметь какой-либо эффект? @IronMan
2. Разные задачи все еще могут выполняться одновременно.