我已经启动了固定速率的计时器。当用户更改系统时间时,任务将连续执行。它不考虑周期时间。如何管理。
timer.scheduleAtFixedRate(task, delay, period);
注意:现在系统时间为当前时间,周期为30秒。现在用户将系统时间更改为从当前时间开始 10 分钟后。此时计时器任务不考虑该时间段。在一秒钟内它执行任务 20 次。
当我使用
timer.schedule(task, delay, period);
代替
timer.scheduleAtFixedRate(task, delay, period);
任务正常。如果我将系统时间更改为过去 10 分钟,从现在开始任务不会执行...
如何解决? :(
最佳答案
看看this堆栈溢出答案;长话短说,使用scheduleAtFixedRate
将您安排的任务排队,并根据任务首次排队的系统时间触发它们;如果有任何事情应该延迟这些任务的开火,他们会玩“ catch ”并尽可能快地开火。因此,在您将系统时间更改为 +10 分钟如何使事件触发 20 次的示例中,假设您的周期为 30 秒(1m/2 = 30s,10m*2 = 20 个事件)。
使用 schedule
函数也有类似的问题,只是它不播放“catch up”;如果你有一个定时器设置为每 30 秒触发一次,然后在定时器启动后仅 10 秒将系统时间更改为 +10 分钟,你的第一个事件将触发,然后继续等待 30 秒延迟并再次触发(除非您再次更改系统时钟)。
如果您想要独立于系统时间的东西,您将需要单调的时钟值。据我所知,Java API 不直接包含任何单调计时器(出于多种原因),但这并不能阻止您自己实现一个计时器(尽管以自定义计时器类代码中可能浪费的执行时间为代价)。 Here's a Stack Overflow关于这个的问题,以及一个Google Group关于它的讨论帖。
如果您真的很难使用单调计时器,您可以使用 POSIX API's并做一些 Java->C JNI 工作。
我希望这能有所帮助(至少指向一个可靠的方向)。
关于java - 计时器在 Java 中意外触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22979641/