【问题标题】:Timer triggered unexpectedly in java定时器在java中意外触发
【发布时间】:2014-04-10 05:52:44
【问题描述】:

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

timer.scheduleAtFixedRate(task, delay, period);

注意:现在系统时间是当前时间。周期是 30 秒。现在用户将系统时间更改为从当前时间开始的 10 分钟后。此时计时器任务不考虑该时间段。在一秒钟内它执行任务 20 次。

当我使用时

 timer.schedule(task, delay, period);

而不是

timer.scheduleAtFixedRate(task, delay, period);

任务正常工作。如果我将系统时间更改为从现在起过去 10 分钟的时间,则任务不会执行...

如何解决这个问题? :(

【问题讨论】:

  • 请展示一个简短但完整的程序来说明问题。例如,您是否可能期望周期以秒为单位,而实际上以毫秒为单位?
  • 您是说task 的执行与delayperiod 无关吗?
  • 是的。任务与延迟和周期无关
  • 感谢您的 cmets Jon Skeet 和 txtechhelp

标签: java android


【解决方案1】:

看看this Stack Overflow 的回答;长话短说,使用scheduleAtFixedRate 将排队您已安排的任务,并相对于任务首次排队的系统时间触发它们;如果有什么东西会延迟这些任务的发射,它们会“追赶”并尽可能快地发射。因此,在您将系统时间更改为 +10 分钟的示例中,鉴于您的周期为 30 秒(1m/2 = 30s,10m*2 = 20 个事件),因此事件触发了 20 次。

使用schedule 函数也有类似的问题,只是它不播放'catch up';如果您将计时器设置为每 30 秒触发一次,然后在计时器启动 10 秒后将系统时间更改为 +10 分钟,您的第一个事件将触发,然后继续等待 30 秒延迟并再次触发(除非您再次更改系统时钟)。

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

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

我希望这能有所帮助(至少指向一个坚实的方向)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多