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的问题。请帮忙