如果计时器落后于计划怎么办?

时间:2016-11-17 10:40:04

标签: java timer schedule threadpoolexecutor

我正在使用java.util.Timer课程。我用它来执行重复的任务。 (例如,每秒检查一次状态的轮询机制。)

timer.scheduleAtFixedRate(new Poller(), 0, pollingInterval);

问题是:定时器可能落后。例如如果他们需要每秒执行一次,那么任务需要2秒才能执行。

文档说计时器将尝试赶上。例如突然间,如果执行任务只需要半秒钟,它就会加速。

首先,我想知道,是否有内置方式来检测它是否在后面运行。

但无论如何,我正在寻找一种方法来禁用追赶行为。 如果它落后,我只是希望它跳过几个周期。

(我也使用了ScheduledThreadPoolExecutor来完成类似的任务。它有更多的选择,也许这可能是解决方案。但是找到它有点过于庞大。)

编辑:

现在我考虑一下,我认为使用ScheduledThreadPoolExecutor进行此操作的方法是使用scheduleWithFixedDelay方法,该方法在任务执行之间使用间隔

仍然有办法用Timer实现相同的目标吗?

1 个答案:

答案 0 :(得分:0)

如果您不关心计时器是否落后,为什么不使用带有Thread.sleep的简单while循环,例如:

while(condition) {
    // do work here
    Thread.sleep(1000L);
}

如果由于操作系统调度限制而落后,它将永远不会尝试弥补丢失的时间。它将始终延迟至少您指定的时间。记住,简单比复杂更好。