2014-09-26 111 views
1

这个问题是关于做某种等待的库函数之间的关系, Thread.sleep(long),Object.wait(long),BlockingQueue.poll(long, TimeUnit),以及由System.nanoTime()System.currentTimeMillis()返回的值。Thread.sleep()使用与System.nanoTime相同的时钟()

据我所知,至少有两个主要的独立时钟的Java应用程序可以访问:

  • System.currentTimeMillis(),这基本上是挂钟时间,这也意味着用户和像NTP守护程序这样的系统软件可能不时地摆弄它,可能导致该值在任何方向和数量上跳跃。
  • System.nanoTime()这是保证单调,或多或少稳步增加,但可能会漂移,因为不那么合格的处理器时钟频率和节电机制造成的人工制品。

现在我明白了库函数像Thread.sleep()需要依靠一些依赖于平台的界面上,直到指定的时间已经过去了暂停一个线程,但它是安全的假设,通过这些功能所计量的时间基于System.nanoTime()的值?

我知道这些函数都不能保证比几毫秒更准确地测量时间,但我对很长时间(如小时)的等待感兴趣。即如果我拨打Thread.sleep(10 * 3600 * 1000),两个时钟之间测量的时间可能会相差几分钟,但我认为其中一个时间会在所请求的10个小时的几分之一秒内。如果两个时钟中的任何一个是,我假设它是由System.nanoTime()使用的那个。这些假设是否正确?

+1

不要依赖很长的等待时间,对于一个线程每分钟都会醒来并检查时间来说,这是完全正确的。 – biziclop 2014-09-26 13:19:31

回答

2

不,假设Thread.sleep基于System.nanoTime并不安全。

Java依靠OS来执行线程调度,并且它无法控制OS如何执行它。

1

大部分情况下,基于时间的API在jdk 1.5之前(Timer,Thread.sleep,wait(long))都会使用基于毫秒的时间。在jdk 1.5+(java.util.concurrent。*)中添加的大多数并发实用程序都使用基于nano的时间。

但是,我不认为jvm保证这些行为,所以你当然不应该依靠某种方式的行为。

相关问题