Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ThreadPoolScheduler间隔小于任务的执行时间_Java_Spring_Concurrency - Fatal编程技术网

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

Java ThreadPoolScheduler间隔小于任务的执行时间,java,spring,concurrency,Java,Spring,Concurrency,我使用Spring ThreadPoolTaskScheduler每5分钟执行一个非同步方法。有时,该方法的执行时间超过5分钟。我曾尝试观察这种场景中的行为,似乎在当前执行完成之前(即使5分钟的间隔结束),不会再次执行该方法 虽然这符合我想要完成的任务,但是我想知道为什么在5分钟后没有生成第二个线程来并行执行这个方法,而这个线程需要5分钟以上的时间。起初我认为这与池大小有关,默认情况下池大小为1。然而,即使我增加了池的大小,行为仍然是一样的 我试图深入研究ThreadPoolScheduler代

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

scheduleAtFixedRate(新的Runnable(){
公开募捐{
executeThis();//有时需要5分钟以上的时间
}
}, 5*60*1000);
问候,


Tushar

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

不会生成第二个线程,因为它会破坏方法的约定,如中所述:

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


此行为是经过设计和记录的行为。

正如我前面所说,我确实尝试过增加池大小,但这似乎不会影响行为。