我使用Spring ThreadPoolTaskScheduler每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);
此致
图莎尔
答案 0 :(得分:4)
答案 1 :(得分:3)
您的池大小为1 - 因此,5分钟后,它会提交一个新任务 - 但是,没有可用于运行它的线程。因此任务等待直到原始线程完成,然后安排新任务。如果任务确实需要以固定间隔启动,请增加池大小。