计时器在java中意外触发

时间:2014-04-10 05:52:45

标签: java android

我已经启动了固定费率的计时器。当用户更改系统时,该时间的任务是连续执行的。它不考虑周期时间。如何管理。

timer.scheduleAtFixedRate(task, delay, period);

注意:现在系统时间是当前时间。时间是30秒。现在用户将系统时间从当前时间改变为10分钟。在那个时间计时器任务不考虑周期。在一秒钟内,它执行任务20次。

当我使用

 timer.schedule(task, delay, period);

而不是

timer.scheduleAtFixedRate(task, delay, period);

任务正常工作。如果我从现在开始将系统时间改为10分钟,那么任务就不会执行......

如何解决这个问题? :(

1 个答案:

答案 0 :(得分:1)

看看this Stack Overflow答案;长话短说,使用scheduleAtFixedRate将排队您已安排的任务,并相对于该任务首先排队的系统时间触发它们;如果有什么东西可以阻止这些任务被解雇,他们就会尽可能快地“赶上”并开火。所以在你举例说明如何将系统时间改为+10分钟使得事件发生了20次,因为你的时间是30秒(1m / 2 = 30s,10m * 2 = 20个事件)。

使用schedule函数有类似的问题,除了它没有“追赶”;如果你有一个定时器设置为每30秒触发一次,那么在定时器启动后仅10秒将系统时间更改为+10分钟,第一个事件将触发,然后继续等待30秒延迟并再次触发(除非你再次改变系统时钟。)

如果你想要一些与系统时间无关的东西,你需要单调的时钟值。据我所知,Java API不直接包含任何单调计时器(由于多种原因),但这并不能阻止您自己实现一个(尽管以自定义计时器类代码中可能浪费的执行时间为代价)。 Here's a Stack Overflow有关此问题的问题,以及关于此问题的Google Group讨论帖。

如果你真的很难使用单调计时器,你可以使用POSIX API's并做一些Java-> C JNI工作。

我希望这有助于(至少指出一个坚实的方向)。