Как работает ScheduledExecutorService, если вызов метода scheduleWithFixedDelay больше раз, чем размер пула? - PullRequest
0 голосов
/ 06 сентября 2018

В этом коде я создаю ScheduledExecutorService с пулом из 5 потоков и вызвать scheduleWithFixedDelay метод 5 раз. Это создаст 5 планировщиков, и каждый планировщик будет вызывать testBean::test каждые секунды:

@PostConstruct
public void hz() {
    ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(5, new ThreadPoolTaskScheduler());
    for (int i = 0; i < 5; i++) {
        scheduledExecutorService.scheduleWithFixedDelay(testBean::test, 1, 1, TimeUnit.SECONDS);
    }
}

Но у меня есть несколько вопросов.

  1. Правильно ли я понимаю, что ScheduledExecutorService просто интерфейс Java, а ThreadPoolTaskScheduler() - это весна I, plementation?

  2. Существует ли вместо этого пружинный аналог ScheduledExecutorService?

  3. Самый важный вопрос . Что произойдет, если я попытаюсь вызвать метод scheduleWithFixedDelay больше раз, чем пул в ScheduledExecutorService (например, 9)?:

@PostConstruct
public void hz() {
    ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(5, new ThreadPoolTaskScheduler());
    for (int i = 0; i < 9; i++) {
        scheduledExecutorService.scheduleWithFixedDelay(testBean::test, 1, 1,

TimeUnit.SECONDS); } }

1 Ответ

0 голосов
/ 08 сентября 2018

Короткий ответ: любая запланированная задача, которую вы отправляете, получает приоритет в очереди (в зависимости от времени, когда она должна выполняться) в глобальной очереди вашего пула потоков. Затем отдельные потоки выбирают задачи и выполняют их по порядку. Итак, в вашем случае, при t = 1, 5 потоков в пуле выберут 5 элементов из очереди и выполнят их параллельно. Когда они завершат выполнение, следующие 4 элемента будут выбраны в момент времени = (1 + время, необходимое для выполнения вашей функции обратного вызова). Таким образом, если ваша функция обратного вызова не запустит поток в течение нескольких секунд, все 9 запланированных задач должны выполняться приблизительно при t = 1.

...