如果TimerTask执行的时间比指定的时间间隔长,会发生什么?

Ove*_*esh 20 java multithreading timer

使用时

Timer.schedule(TimerTask task, long delay, long period)

(即具有固定延迟执行),如果指定TimerTaskrun()方法花费的时间超过period完成时会发生什么?是否有可能TimerTask因为这个而运行两个并发线程?如果是这样,有没有办法避免它?

Joo*_*kka 22

Timer的文档说明如下:

计时器任务应该快速完成.如果计时器任务花费过多时间来完成,它会"占用"计时器的任务执行线程.反过来,这可以延迟后续任务的执行,后续任务可以在紧急任务最终完成时(以及如果)快速连续地"聚集"并执行.

也就是说,并发TimerTask线程将不会运行.任务将累积到队列中.这可能适合也可能不适合(更有可能,不适用).

  • 我喜欢你描述的方式"任务会累积到队列中".绝对比文档描述为"hogs"和"束缚"更好.特别是对于那些英语不好xD的人 (7认同)

ska*_*man 16

Timer并且TimerTask不要很好地处理这种情况.如果你想更好地处理它,那么不要使用这些类.

java.util.concurrent.ScheduledExecutorService提供了两个调度方法,scheduleAtFixedRate并且scheduledWithFixedDelay,支配时会发生什么任务"聚成一团".

scheduleAtFixedRate:

创建并执行一个周期性操作,该操作在给定的初始延迟后首先启用,然后在给定的时间段内启用; 即执行将在initialDelay之后开始,然后是initialDelay + period,然后是initialDelay + 2*period,依此类推.如果任务的任何执行遇到异常,则后续执行被禁止.否则,任务将仅通过取消或终止执行者来终止.如果此任务的执行时间超过其周期,则后续执行可能会延迟,但不会同时执行.

scheduleWithFixedDelay:

创建并执行一个周期性动作,该动作在给定的初始延迟之后首先被启用,并且随后在一次执行的终止和下一次执行的开始之间给定延迟.如果任务的任何执行遇到异常,则后续执行被禁止.否则,任务将仅通过取消或终止执行者来终止.

您可以ScheduledExecutorService使用Executors工厂类创建实例.

  • `scheduleAtFixedRate`比`Timer`和`TimerTask`更好?两者都确保内容以固定的间隔发生,如果间隔溢出到下一次执行,则执行排队. (2认同)