使用时
Timer.schedule(TimerTask task, long delay, long period)
(即使用固定延迟执行),如果指定的TimerTask
的{{1}}方法花费的时间超过run()
,会发生什么?是否有可能因此而运行两个并发的period
线程?
如果是这样,有没有办法避免它?
答案 0 :(得分:21)
计时器的documentation说明如下:
计时器任务应该快速完成。如果计时器任务花费过多时间来完成,它会“占用”计时器的任务执行线程。反过来,这可以延迟后续任务的执行,这些后续任务可能会在违规任务最终完成时(以及如果)快速连续地“聚集”并执行。
也就是说,并发TimerTask
个线程不会运行。任务将累积到队列中。这可能适合也可能不适合(更有可能,不适用)。
答案 1 :(得分:16)
Timer
和TimerTask
不能很好地处理这种情况。如果你想更好地处理它,那么不要使用这些类。
java.util.concurrent.ScheduledExecutorService
提供了两种调度方法,scheduleAtFixedRate
和scheduledWithFixedDelay
,用于管理任务“聚集”时会发生什么。
scheduleAtFixedRate
:
创建并执行定期操作 在...之后首先启用 给出初始延迟,然后 在给定的时期内;那是 执行将在之后开始 initialDelay然后是initialDelay + period, 然后是initialDelay + 2 *期间,等等 上。如果执行了任务 遇到异常,随后 执行被压制。除此以外, 任务只会通过终止 取消或终止 遗嘱执行人。如果有任何执行 任务需要比其期限更长的时间, 随后的执行可能会开始 迟到了,但不会同时发生 执行。
scheduleWithFixedDelay
:
创建并执行定期操作 在...之后首先启用 给出初始延迟,然后 在给定的延迟之间 终止一个执行和 下一个开始。如果有的话 执行任务遇到一个 例外,后续执行是 抑制。否则,任务将 只能通过取消或终止 终止执行人。
您可以使用ScheduledExecutorService
工厂类创建Executors
个实例。