【问题标题】:Stable timer independent of system time独立于系统时间的稳定定时器
【发布时间】:2011-12-24 09:33:53
【问题描述】:

我在我的应用程序中使用java.util.Timer触发作业,但我发现它取决于系统时间:如果调整系统时间,则会影响定时器的触发器。

例如,如果系统时间倒退 80 秒,则计时器将停止工作 80 秒。

Java 有一个独立于系统时间的System.nanoTime 方法,但似乎它 不能用于Timer

是否有支持我需要的计时器库?还是我必须自己实现?

请注意,我不需要精确的当前时间(日期),我需要精确的时间间隔

【问题讨论】:

  • 从 Java 5.0 (2004) 开始,您可以使用 ScheduledExecutorService。
  • @PeterLawrey,nanoTime 自同一个版本以来就存在,所以 OP 应该知道 ScheduledExecutor。
  • 我使用了 ScheduledExecutoeService,但我遇到了 64 位 JVM 的问题。请帮助stackoverflow.com/questions/9044423/…

标签: java timer


【解决方案1】:

你有两个选择:

  • 写你的一个计时器,相对来说微不足道。在任何人告诉reinvent the wheel 之前,能够自己完成任务总是很重要的。尤其是大约 20 行代码时。
  • 使用java.util.concurrent.ScheduledThreadPoolExecturorscheduleAtFixedRate,队列实现。基于System.nanoTime
  • 安装ntp 守护程序,该守护程序通过在很长一段时间内以非常轻微的方式调整(减慢、加快)系统时钟来调整时间。

几乎没有其他事情,完美的 100 毫秒在非实时 GC 环境中是一个很高的要求,因为 GC 有时可能会 STW(停止世界)几秒钟。 Sun 的 GC 不能非常可靠地做到这一点。 IBM 的 Metronome 在修改后的 Linux 内核上运行应该能够做到。您可能需要注意您的应用程序是否真正要求实时性。

【讨论】:

    【解决方案2】:

    如果您的计算机与 Internet 隔离,我认为如果用户篡改时钟,您将无能为力。

    另一方面,如果不是这种情况,您会发现相当多的 API 和 Mashup 可以让您读取正确的时间。你可以从那里读取时间。您可以从time.gov 读取时间。另外twinsun.com 你给了你很多额外的选择。

    100 毫秒对于 Internet 时间访问来说似乎太低了。

    【讨论】:

    • 是的,另一个解决方案是让系统以合适的频率自动调整系统时间。如果变化范围在 1 秒或 2 秒内,那可以接受。但这不是完美的方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多