ThreadPoolScheduler间隔小于任务的执行时间

Tus*_*har 3 java concurrency spring

我使用 Spring ThreadPoolTask​​Scheduler 每 5 分钟执行一个不同步的方法。有时该方法的执行时间会超过 5 分钟。我试图观察这种情况下的行为,并且似乎在当前执行完成之前该方法不会再次执行(即使 5 分钟间隔结束)。

虽然这适合我想要完成的任务,但我想知道为什么 5 分钟后没有生成第二个线程来与花费超过 5 分钟的线程并行执行该方法。起初我认为这与池大小有关,默认情况下为 1。但是,即使我增加了池大小,行为仍然保持不变。

我尝试深入研究 ThreadPoolScheduler 代码,发现它在内部通过 ThreadPoolExecutor 运行任务。它是否设计为仅运行一个线程,即使间隔已过,该线程也会等待一个执行完成后再触发另一个执行?

就代码而言,这是我所做的 -

<task:scheduler id="scheduler" pool-size="1" />


 scheduler.scheduleAtFixedRate(new Runnable() {
  public void run() {
     executeThis(); // this takes more than 5 minutes sometime
  }
 }, 5*60*1000);
Run Code Online (Sandbox Code Playgroud)

问候,

图沙尔

JB *_*zet 5

不会生成第二个线程,因为它会破坏其 javadoc中指定的方法的约定:

如果此任务的任何执行时间超过其周期,则后续执行可能会延迟开始,但不会同时执行。

此行为是设计的、记录的行为。