如果调用scheduleWithFixedDelay方法多于池大小,ScheduledExecutorService如何工作?

问题描述 投票:0回答:1

在这段代码中,我用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() - 是春天我,补充吗?
  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); }}

java multithreading scheduled-tasks executorservice executors
1个回答
1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.