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

时间:2010-02-15 07:25:31

标签: java multithreading timer

使用时

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

(即使用固定延迟执行),如果指定的TimerTask的{​​{1}}方法花费的时间超过run(),会发生什么?是否有可能因此而运行两个并发的period线程? 如果是这样,有没有办法避免它?

2 个答案:

答案 0 :(得分:21)

计时器的documentation说明如下:

  

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

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

答案 1 :(得分:16)

TimerTimerTask不能很好地处理这种情况。如果你想更好地处理它,那么不要使用这些类。

java.util.concurrent.ScheduledExecutorService提供了两种调度方法,scheduleAtFixedRatescheduledWithFixedDelay,用于管理任务“聚集”时会发生什么。

scheduleAtFixedRate

  

创建并执行定期操作   在...之后首先启用   给出初始延迟,然后   在给定的时期内;那是   执行将在之后开始   initialDelay然后是initialDelay + period,   然后是initialDelay + 2 *期间,等等   上。如果执行了任务   遇到异常,随后   执行被压制。除此以外,   任务只会通过终止   取消或终止   遗嘱执行人。如果有任何执行   任务需要比其期限更长的时间,   随后的执行可能会开始   迟到了,但不会同时发生   执行。

scheduleWithFixedDelay

  

创建并执行定期操作   在...之后首先启用   给出初始延迟,然后   在给定的延迟之间   终止一个执行和   下一个开始。如果有的话   执行任务遇到一个   例外,后续执行是   抑制。否则,任务将   只能通过取消或终止   终止执行人。

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