我使用java.util.Timer
在我的应用程序中触发作业,但我发现它取决于系统时间:如果调整系统时间,计时器的触发器将受到影响。
例如,如果系统时间回退80秒,计时器将停止工作80秒。
Java有一个System.nanoTime
方法,它与系统时间无关,但似乎就是这样
不能在Timer
中使用。
是否有支持我需要的定时器库?或者我必须自己实施?
请注意,我不需要精确的当前时间(日期),我需要一个精确的时间间隔
答案 0 :(得分:6)
你有两个选择:
reinvent the wheel
之前,能够自己承担任务总是很重要。特别是当它大约有20行代码时。java.util.concurrent.ScheduledThreadPoolExecturor
并使用队列impl scheduleAtFixedRate
。基于System.nanoTime
。ntp
守护程序,通过在很长一段时间内以非常轻微的方式调整(减慢,加速)系统时钟来调整时间。很少有其他事情,完美的100毫秒是非实时GC环境中的高阶,因为GC有时可能STW(停止世界)几秒钟。 Sun的GC不能可靠地做到这一点。应该在改进的Linux内核上运行IBM的Metronome。您可能希望注意您的应用程序是否真正具有实时性要求。
答案 1 :(得分:0)
如果您的计算机处于隔离状态并且不在Internet上,我认为如果用户篡改时钟,您可以做的事情并不多。
另一方面,如果不是这种情况,您会发现很多API和Mashup可以让您读取正确的时间。你可以从那里读出时间。你可以从time.gov读取时间。另外twinsun.com你会给你很多额外的选择。
100ms对于互联网时间访问来说似乎太低了。