在这段代码中,我用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()
- 是春天我,补充吗?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); }}
简短的回答是,您提交的任何计划任务都会在线程池的全局队列中优先排队(基于其应该运行的时间)。然后,各个线程接收任务并按顺序执行它们。因此,在您的情况下,在t = 1时,池中的5个线程将从队列中挑选5个项并并行执行它们。当他们完成执行时,将在时间=(1 +执行回调函数所需的时间)时选择接下来的4个项目。因此,除非您的回调函数占用线程几秒钟,否则所有9个计划任务应该大约在t = 1时执行。