这个问题是关于做某种等待的库函数之间的关系, 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()
使用的那个。这些假设是否正确?
不要依赖很长的等待时间,对于一个线程每分钟都会醒来并检查时间来说,这是完全正确的。 – biziclop 2014-09-26 13:19:31