我使用的是java.util.Timer
类。我用它来执行重复性的任务。(例如,每秒钟检查一次状态的轮询机制)。
timer.scheduleAtFixedRate(new Poller(), 0, pollingInterval);
问题情况是:计时器可能落后于。例如,如果它们需要每秒执行一次,并且任务需要2秒执行。
文档中说计时器会尝试追赶。突然间,如果任务只需要半秒钟就能执行,它就会加快速度。
首先,我想知道,是否有内置的方法来检测它是否运行在之后。
但无论如何,我正在寻找一种方法来禁用追赶行为。如果它落后了,我只想让它跳过几个循环。
(我也使用ScheduledThreadPoolExecutor
来完成类似的任务。它有更多的选择,也许这就是解决方案。但是要找到它有点太困难了
现在我想了想,我认为ScheduledThreadPoolExecutor
的方法是使用scheduleWithFixedDelay
方法,它在任务执行之间使用间隔。
还有,有没有一种方法可以实现相同的Timer
?
如果你不在乎计时器是否落后,为什么不使用一个简单的线程while循环呢?睡眠,例如:
while(condition) {
// do work here
Thread.sleep(1000L);
}
如果由于操作系统调度限制而落后,它将永远不会尝试弥补丢失的时间。它总是会延迟至少您指定的时间。记住,简单比复杂好。