Java的ScheduledExecutorService.scheduleAtFixedRate()的行为

时间:2012-01-16 22:17:01

标签: java concurrency scheduling

我对Java 6中ScheduledExecutorService的scheduleAtFixedRate()方法有疑问。

[ 编辑 :1.6的Javadoc比1.5的更完整。见下面的评论]

鉴于:

  • ScheduledExecutorService构造为池中N = 1个线程
  • 固定费率是T秒的时间段
  • 没有初始延迟

在这种情况下会发生什么(在实时意义上,时间并不是绝对的):

  • 在时间T,服务启动Runnable任务“task1”
  • 在时间2T,task1尚未完成,服务计划启动

服务是否保证可以执行以下任何操作?

  • (a)在2T,启动Runnable任务,“task2”(召回N = 1)
  • (b)阻止,直到task1完成
  • (c)跳过此时间并再次尝试3T
  • (d)行为未定义

还是其他什么?如果N> 1,答案是否会改变? 1?

2 个答案:

答案 0 :(得分:7)

答案是

  

(b)阻止任务1完成

,无论执行程序的线程数是多少(task2甚至可能都没有提交)。

医生说:

  

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

(顺便说一句,由于没有初始延迟,“task1”将立即启动,因为docs.ed:

  

执行将在initialDelay

之后开始

)。

答案 1 :(得分:1)

来自您关联的文档...

  

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