如果调用scheduleWithFixedDelay方法的次数超过池大小,则ScheduledExecutorService的工作方式如何?

时间:2018-09-06 07:42:00

标签: java multithreading scheduled-tasks executorservice executors

在这段代码中,我创建了具有5个线程池的ScheduledExecutorService 并调用scheduleWithFixedDelay方法5个时间。它将创建5个调度程序,每个调度程序将在每个secons调用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()-是spr​​ing i,plementation吗?

  2. 它是否存在spring类似物而不是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 :(得分:1)

简短的答案是,您提交的任何计划任务都会在线程池的全局队列中(根据应运行的时间)排入优先级队列。然后,各个线程拾取任务并按顺序执行它们。因此,在您的情况下,在t = 1时,池中的5个线程将​​从队列中选择5个项目并并行执行。当它们完成执行时,接下来的4个项目将在时间=(1 +执行回调函数所需的时间)处被选择。因此,除非您的回调函数将线程占用了几秒钟,否则所有9个计划任务都应大约在t = 1时执行。