我使用 java.util.Timer
在我的应用程序中触发作业,但我发现这取决于系统时间:如果调整系统时间,计时器的触发器会受到影响。
例如,如果系统时间倒退 80 秒,计时器将停止工作 80 秒。
Java有一个独立于系统时间的System.nanoTime
方法,但似乎它不能在Timer
中使用。
是否有支持我需要的计时器库?还是我必须自己实现?
请注意,我不需要精确的当前时间(日期(,我需要精确的时间间隔
您有 2 个选项:
- 写你的一个计时器,相对琐碎。在任何人告诉
reinvent the wheel
之前,能够自己承担任务始终很重要。特别是当它大约有 20 行代码时。 - 使用
java.util.concurrent.ScheduledThreadPoolExecturor
并使用scheduleAtFixedRate
,队列 impl. 基于System.nanoTime
。 - 安装
ntp
守护程序,该守护程序通过在长时间跨度内以非常轻微的方式调整(减慢、加速(系统时钟来调整时间。
其他几件事,完美的 100ms 在非实时 GC 环境中是一项艰巨的任务,因为 GC 有时可能会 STW(停止世界(几秒钟。Sun 的 GC 无法非常可靠地做到这一点。IBM的节拍器运行在修改后的Linux内核上应该能够。您可能希望注意您的应用程序是否真的需要实时性。
如果您的计算机是孤立的并且不在互联网上,我认为如果用户篡改时钟,您将无能为力。
另一方面,如果不是这种情况,您会发现很多API和Mashup可以让你读取正确的时间。你可以从那里阅读时间。你可以从 time.gov 读取时间。另外 twinsun.com 你给你很多额外的选择。
100 毫秒对于互联网时间访问来说似乎太低了。