在这段代码中,我创建了具有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);
}
}
但是我有很多问题。
我是否正确理解ScheduledExecutorService
只是java接口和ThreadPoolTaskScheduler()
-是spring i,plementation吗?
它是否存在spring类似物而不是ScheduledExecutorService
?
最重要的问题。如果我尝试调用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); } }
答案 0 :(得分:1)
简短的答案是,您提交的任何计划任务都会在线程池的全局队列中(根据应运行的时间)排入优先级队列。然后,各个线程拾取任务并按顺序执行它们。因此,在您的情况下,在t = 1时,池中的5个线程将从队列中选择5个项目并并行执行。当它们完成执行时,接下来的4个项目将在时间=(1 +执行回调函数所需的时间)处被选择。因此,除非您的回调函数将线程占用了几秒钟,否则所有9个计划任务都应大约在t = 1时执行。