ScheduledExecutorService не создает параллельные потоки

#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, не перекрываются. Хотя разные выполнения могут выполняться разными потоками, последствия предыдущих выполнений происходят раньше, чем последствия последующих.

Если какое-либо выполнение этой задачи занимает больше времени, чем ее период, то последующие выполнения могут начаться с опозданием, но не будут выполняться одновременно.

https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ScheduledThreadPoolExecutor.html#scheduleAtFixedRate-java.lang.Выполняемый-длинный-длинный-java.util.concurrent.TimeUnit-

Комментарии:

1. Спасибо, но какова тогда цель core pool? Будет ли это иметь какой-либо эффект? @IronMan

2. Разные задачи все еще могут выполняться одновременно.