稳定的计时器,独立于系统时间



我使用 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 毫秒对于互联网时间访问来说似乎太低了。

最新更新