2

我知道我必须使用它而不是java.util.Timer因为各种原因。所以,为了研究这个,我正在查看文档,我有几个问题:

  1. 如何scheduleWithFixedDelay()工作?我的理解是:它在给定延迟后首先执行任务。一旦任务完成,它会等待指定的时间,然后再次执行任务。
  2. 当我提交的任务scheduleAtFixedRate()执行时间比指定的延迟时间长时会发生什么?就像我希望任务每 5 秒执行一次,但需要 10 秒才能完成。 我的理解是任务将被保存在队列中,一旦核心线程可用就会执行
  3. 这是我对如何scheduleWithFixedDelay()scheduleAtFixedRate()不同的理解: scheduleWithFixedDelay()等待任务完成执行,等待指定的时间,然后再次触发任务,因为scheduleAtFixedRate将继续触发任务而不关心它是否完成。正确的?
4

1 回答 1

4
  1. 正确的。
  2. 不完全的。如果一个固定速率的任务花费的时间比它的周期长,它会在完成后立即再次运行,但下一次运行不是等待线程。见下文。
  3. 固定速率任务确实关心其先前的运行是否已完成,就像固定延迟任务一样。根据文档,“如果此任务的任何执行时间超过其周期,则后续执行可能会延迟开始,但不会同时执行。”

这样想:

  • 对于固定延迟任务,您指定一个周期,该周期将是运行之间的确切时间量。任务的实际持续时间对延迟没有影响。
  • 对于固定速率任务,您指定一个周期,该周期将是运行之间的最大时间量。如果任务的实际持续时间长于周期,则速率会降低,实际上没有延迟。
于 2013-11-12T07:30:42.840 回答