2011-12-24 31 views
5

我使用java.util.Timer在我的应用程序中触发作业,但是我发现它取决于系统时间:如果系统时间已调整,则计时器的触发器将受到影响。独立于系统时间的稳定计时器

例如,如果系统时间回退80秒,计时器将停止工作80秒。

Java有一个与系统时间无关的System.nanoTime方法,但它似乎不能在Timer中使用 。

是否有Timer库支持我所需要的?或者我必须自己实现它?

请注意,我并不需要一个精确的当前时间(日期),我需要一个精确的时间间隔

+0

自Java 5.0(2004)以来,您可以使用ScheduledExecutorService。 – 2011-12-24 11:13:22

+1

@PeterLawrey,nanoTime自同一版本以来就存在,所以OP应该知道ScheduledExecutor。 – bestsss 2011-12-24 15:56:36

+0

我使用了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

回答

6

你有2种选择:

  • 撰写您一个定时器,比较琐碎。在任何人告诉reinvent the wheel之前,能够自己完成任务总是很重要的。特别是当它大约有20行代码时。
  • 使用java.util.concurrent.ScheduledThreadPoolExecturor并使用scheduleAtFixedRate,队列impl。基于System.nanoTime
  • 安装ntp守护进程通过在很长时间内以非常轻微的方式调整(减慢,加速)系统时钟来调整时间。

很少有其他的东西,完美的100ms在非实时GC环境中是一个很高的命令,因为GC可能有时会STW(停止世界)秒。 Sun的GC不能做到超级可靠。在修改后的Linux内核上运行的IBM节拍器应该能够。如果您的应用程序真正需要实时性,您可能需要注意。

0

如果您的计算机是孤立的,从互联网上我认为没有什么可以做,如果用户篡改时钟。另一方面,如果不是这种情况,你会发现很多API和Mashups可以让你阅读正确的时间。你可以从那里读到时间。您可以从time.gov读取时间。另外twinsun.com你给你很多额外的选择。

100ms对于Internet访问时间似乎太低。

+0

是的,另一个解决方案是让系统自动调整系统时间在适当的频率。如果在1秒或2秒内改变范围,那可以接受。但这不是完美的方式。 – jean 2011-12-24 10:00:27