【问题标题】:Behavior of ScheduledExecutorServiceScheduledExecutorService 的行为
【发布时间】:2018-01-03 06:46:12
【问题描述】:

我一直想知道 Java 中 ScheduledExecutorService 的具体情况。

让,

ScheduledExecutorService = new ScheduledThreadPoolExecutor(2);

service.scheduleAtFixedRate(new Runnable() {

 @Override
 public void run() {
      //Some task taking longer than schedule period to finish executing.
 }

},initialDelay,period,TimeUnit.SECONDS);

在这种情况下,假设周期为 4 秒。当计划在 initialdelay 之后开始执行时,任务将被阻塞在 while(true) 无限循环中。 我的问题是每 4 秒后是否会安排一个任务,而不管上一轮任务的执行(未完成)?因为如果是这种情况,这段代码最终会在内存不足后崩溃。

感谢您的帮助。

谢谢。

【问题讨论】:

  • 这真的很重要吗?如果你在任务中有while(true),你的代码已经坏了。
  • 是的,我知道。这不是真正的代码。只是任务可能需要比期间更长的时间,但最终肯定会在一段时间后返回。

标签: java multithreading


【解决方案1】:

来自scheduleAtFixedRate()的javadoc:

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

意味着任务将启动一次,但由于它永远不会完成,因此不会有其他调用。你只会在池中浪费一个线程。

这同样适用于scheduleWithFixedDelay(),因为延迟是从上一次执行完成的时间开始计算的(因为它没有完成,所以不会发生下一次执行)。

【讨论】:

  • 同样来自 Javadoc "通过scheduleAtFixedRatescheduleWithFixedDelay 安排的周期性任务的连续执行不重叠。虽然不同的执行可能由不同的线程执行,但先前执行的影响发生在后续事件之前”
  • 那么这是否意味着在前一个退出之前不会有后续任务排队? (线程池大小=1)
  • @NowaConcordia 如果您的意思是任务是否堆积,那么没有。只有在完成任务之后才会安排下一个运行时,无论是立即还是延迟之后。
猜你喜欢
  • 1970-01-01
  • 2013-11-12
  • 2011-10-14
  • 2017-10-17
  • 1970-01-01
  • 2022-01-24
  • 2018-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多