2014-09-26 47 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保證這些行爲,所以你當然不應該依靠某種方式的行爲。

相關問題