Java 独立于系统时间的稳定定时器

Java 独立于系统时间的稳定定时器,java,timer,Java,Timer,我使用java.util.Timer在我的应用程序中触发作业,但我发现这取决于系统时间:如果调整系统时间,计时器的触发将受到影响 例如,如果系统时间倒退80秒,计时器将停止工作80秒 Java有一个独立于系统时间的System.nanoTime方法,但似乎 不能在计时器中使用 是否有支持我所需的计时器库?还是我必须自己实施 请注意,我不需要精确的当前时间(日期),我需要一个精确的时间间隔如果您的计算机被隔离并脱离互联网,我认为如果用户篡改时钟,您将无能为力 另一方面,如果不是这样,您将发现相当多

我使用
java.util.Timer
在我的应用程序中触发作业,但我发现这取决于系统时间:如果调整系统时间,计时器的触发将受到影响

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

Java有一个独立于系统时间的
System.nanoTime
方法,但似乎 不能在
计时器中使用

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


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

如果您的计算机被隔离并脱离互联网,我认为如果用户篡改时钟,您将无能为力

另一方面,如果不是这样,您将发现相当多的API和mashup可以让您读取正确的时间。你可以从那里读时间。你可以从中读出时间。你还可以给你很多额外的选择

100毫秒似乎太低,无法上网。

您有两种选择:

  • 写你的一个计时器,相对来说很琐碎。在任何人告诉
    重新发明轮子之前,能够自己完成任务总是很重要的。特别是当它大约有20行代码时
  • 使用
    java.util.concurrent.scheduledThreadPoolExecutor
    并使用
    scheduleAtFixedRate
    ,队列将执行以下操作:。基于
    System.nanoTime
  • 安装
    ntp
    守护进程,该守护进程通过在长时间跨度内微调(减慢、加快)系统时钟来调整时间

除此之外,完美的100毫秒在非实时GC环境中是一个很高的要求,因为GC有时会在几秒钟内停止世界。Sun的地面军事系统不能超级可靠地做到这一点。在修改过的Linux内核上运行的IBM Metronome应该能够。您可能希望注意您的应用程序是否真正需要实时性。

是的,另一个解决方案是让系统以合适的频率自动调整系统时间。如果更改范围在1或2秒内,则可以接受。但这不是最好的方法。因为Java 5.0(2004)可以使用ScheduledExecutorService。@PeterLawrey,nanoTime自同一版本以来就存在,所以OP应该知道ScheduledExecutor。我使用ScheduledExecutorService,但我面临64位JVM的问题。请帮忙