2011-10-13 30 views
2

使用System.nanoTime()同步Java虛擬機 有意義嗎?使用System.nanoTime同步Java虛擬機

我的意思是:

  • 呼叫System.nanoTime(),並把在t1時的結果
  • 甲發送一個數據包到B
  • 當B被接收到來自所述分組,B呼叫System.nanoTime()並將結果發送到A
  • 當來自B的數據包在A上接收時,A調用System.nanoTime()並將結果放入t3中,將從B接收的數據包放入t2中
  • 時移=(t3 - t1)/ 2 - t2

是否正確使用System.nanoTime來做到這一點?

謝謝!

+1

爲什麼你需要這樣的東西?如果您需要在計算機之間進行時間同步,那麼這是一個已解決的問題(例如NTP)。 –

回答

8

是否正確使用System.nanoTime來做到這一點?

System.nanoTime()是僅用於測量時間差一個JVM中,而不是跨多個JVM絕對時間是有用的。

此方法只能用於測量已用時間,並且不涉及任何其他系統或掛鐘時間的概念。返回的值表示自一些固定但任意原點時間以來的納秒(可能在未來,因此值可能爲負)。在Java虛擬機的實例中,此方法的所有調用都使用相同的來源;其他虛擬機實例可能會使用不同的來源。

要解決這個問題,一般來說你會使用System.currentTimeMillis(),但這仍然受到兩臺計算機的操作系統時鐘的限制。 使用NTP在計算機之間同步時間。

請參閱Time synchronization between server and Internet using Java

+0

在不同機器上的歷元時間裏,我們可以在Java中獲得至少微秒精度嗎? – chrisapotek

+0

@chrisapotek即使在單臺機器上,您使用哪種方法獲得μs的紀元時間?我不認爲有內置的,所以...可能不是。 –

0

這並不完全清楚你想要達到的目標。

如果您嘗試同步時鐘,則有專門的協議,例如NTPnanoTime()在任何情況下都是無用的,因爲它的值在JVM之間沒有可比性。

如果您嘗試測量延遲時間,請重複測量往返程度(t3-t1)併除以二。爲此,確實可以使用nanoTime()

0

System.nanoTime()是相對於任意時間點的任意時間點。從我所觀察到的情況來看,它似乎來自計算機的正常運行時間。

這使得比較兩臺機器上的nanoTime非常困難。

timeshift = (t3 + t1)/2 - t2; // note the + instead of - 

您使用的公式可用於近似的兩臺機器之間的差異,但它可以顯示出巨大的差異。解決這個問題的方法之一就是執行這1000次並取平均數或中位數,這在過去給我一個穩定的結果。

此圖需要定期更新,因爲即使溫度可以加快或減慢納秒定時器。

注意:將兩臺機器可靠地保持在毫秒內是令人驚訝的。 ;)