我使用java.util.Timer
在我的应用程序中触发作业,但是我发现它取决于系统时间:如果系统时间已调整,则计时器的触发器将受到影响。独立于系统时间的稳定计时器
例如,如果系统时间回退80秒,计时器将停止工作80秒。
Java有一个与系统时间无关的System.nanoTime
方法,但它似乎不能在Timer
中使用 。
是否有Timer库支持我所需要的?或者我必须自己实现它?
请注意,我并不需要一个精确的当前时间(日期),我需要一个精确的时间间隔
我使用java.util.Timer
在我的应用程序中触发作业,但是我发现它取决于系统时间:如果系统时间已调整,则计时器的触发器将受到影响。独立于系统时间的稳定计时器
例如,如果系统时间回退80秒,计时器将停止工作80秒。
Java有一个与系统时间无关的System.nanoTime
方法,但它似乎不能在Timer
中使用 。
是否有Timer库支持我所需要的?或者我必须自己实现它?
请注意,我并不需要一个精确的当前时间(日期),我需要一个精确的时间间隔
你有2种选择:
reinvent the wheel
之前,能够自己完成任务总是很重要的。特别是当它大约有20行代码时。java.util.concurrent.ScheduledThreadPoolExecturor
并使用scheduleAtFixedRate
,队列impl。基于System.nanoTime
。ntp
守护进程通过在很长时间内以非常轻微的方式调整(减慢,加速)系统时钟来调整时间。很少有其他的东西,完美的100ms在非实时GC环境中是一个很高的命令,因为GC可能有时会STW(停止世界)秒。 Sun的GC不能做到超级可靠。在修改后的Linux内核上运行的IBM节拍器应该能够。如果您的应用程序真正需要实时性,您可能需要注意。
如果您的计算机是孤立的,从互联网上我认为没有什么可以做,如果用户篡改时钟。另一方面,如果不是这种情况,你会发现很多API和Mashups可以让你阅读正确的时间。你可以从那里读到时间。您可以从time.gov读取时间。另外twinsun.com你给你很多额外的选择。
100ms对于Internet访问时间似乎太低。
是的,另一个解决方案是让系统自动调整系统时间在适当的频率。如果在1秒或2秒内改变范围,那可以接受。但这不是完美的方式。 – jean 2011-12-24 10:00:27
自Java 5.0(2004)以来,您可以使用ScheduledExecutorService。 – 2011-12-24 11:13:22
@PeterLawrey,nanoTime自同一版本以来就存在,所以OP应该知道ScheduledExecutor。 – bestsss 2011-12-24 15:56:36
我使用了ScheduledExecutoeService,但是我正面临64位JVM的问题。请帮助http://stackoverflow.com/questions/9044423/java-scheduler-which-is-completely-independent-of-system-time-changes – YoK 2012-01-30 09:05:38