【问题标题】:What is the accuracy of scheduleAtFixedRate?scheduleAtFixedRate 的准确性是多少?
【发布时间】:2009-07-17 10:08:23
【问题描述】:

我们需要关注 Java 程序的 pc 时钟。为此,我们每 500 毫秒使用 scheduleAtFixedRate() 调度一个 Runnable。我们每次都从这里调用 System.currentTimeMillis() 。如果我们看到 500 毫秒 +- 某个允许的增量有更大的差异,那么我们假设时钟已经改变(然后我们需要做一些其他的事情)。

这是一种正确的做事方式吗? Linux 上的测试表明,在正常操作期间,50 毫秒的增量就足够了。在 Windows 上,我们必须将它增加太多 100 毫秒,否则,它认为我们所做的每次检查都改变了时间。

关于如何做到这一点的任何其他想法?

【问题讨论】:

    标签: java


    【解决方案1】:

    如果目标是检测时钟变化,您可以根据已知的时间服务器参考测试当前时钟

    在此处查找更多信息Java NTP client http://support.ntp.org/bin/view/Support/JavaSntpClient 使用绝对时间源,您将能够检测到时钟变化

    【讨论】:

    • 感谢您提供链接,但链接问题中的评论已经表明这是一个幼稚的实现。
    【解决方案2】:

    我假设您使用 Timer 和 TimerTask 类。

    也许您可以使用方法 schedule 而不是 scheduleAtFixedRate。 传递日期的方法 schedule 允许您将任务设置为执行日期,您可以在最后一次执行结束时继续重新安排。 您还可以使用 schedule 传递延迟,它不会像 scheduleAtFixedRate 那样执行追赶。

    javadoc Timer

    【讨论】:

    • Timer 和 TimerTask 现在已经过时了。 ScheduledExecutorService 不仅可以完成所有这些工作。
    猜你喜欢
    • 2020-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-02
    • 2011-10-21
    • 2018-09-20
    • 2019-07-09
    相关资源
    最近更新 更多