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

时间:2012-01-15 05:48:53

标签: java spring concurrency

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

此致

图莎尔

2 个答案:

答案 0 :(得分:4)

第二个帖子没有产生,因为它会破坏its javadoc中指定的方法的契约:

  

如果此任务的执行时间超过其周期,那么   后续处决可能会延迟,但不会同时执行   执行。

此行为是设计的,记录在案的行为。

答案 1 :(得分:3)

您的池大小为1 - 因此,5分钟后,它会提交一个新任务 - 但是,没有可用于运行它的线程。因此任务等待直到原始线程完成,然后安排新任务。如果任务确实需要以固定间隔启动,请增加池大小。