我正在使用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);


问候,

杜沙尔

最佳答案

没有产生第二个线程,因为它会破坏方法的协定(在its javadoc中指定):


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


此行为是设计的,已记录的行为。

10-08 17:58