我正在使用java.util.Timer
课程。我用它来执行重复的任务。 (例如,每秒检查一次状态的轮询机制。)
timer.scheduleAtFixedRate(new Poller(), 0, pollingInterval);
问题是:定时器可能落后。例如如果他们需要每秒执行一次,那么任务需要2秒才能执行。
文档说计时器将尝试赶上。例如突然间,如果执行任务只需要半秒钟,它就会加速。
首先,我想知道,是否有内置方式来检测它是否在后面运行。
但无论如何,我正在寻找一种方法来禁用追赶行为。 如果它落后,我只是希望它跳过几个周期。
(我也使用了ScheduledThreadPoolExecutor
来完成类似的任务。它有更多的选择,也许这可能是解决方案。但是找到它有点过于庞大。)
现在我考虑一下,我认为使用ScheduledThreadPoolExecutor
进行此操作的方法是使用scheduleWithFixedDelay
方法,该方法在任务执行之间使用间隔
仍然有办法用Timer
实现相同的目标吗?
答案 0 :(得分:0)
如果您不关心计时器是否落后,为什么不使用带有Thread.sleep的简单while循环,例如:
while(condition) {
// do work here
Thread.sleep(1000L);
}
如果由于操作系统调度限制而落后,它将永远不会尝试弥补丢失的时间。它将始终延迟至少您指定的时间。记住,简单比复杂更好。