這個問題是關於做某種等待的庫函數之間的關係, 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