簡體   English   中英

System.currentTimeMillis()(Java)錯誤的時間

[英]Wrong Time with System.currentTimeMillis () (Java)

我做了一個小程序來測試System.currentTimeMillis()。 我有一個奇怪的結果。 這是我的日志:

1    26-12-09 20:48:21 - [Log] lTime = 1261860501009
2    26-12-09 20:48:21 - [Log] lTime = 1261860501012
3    26-12-09 20:48:21 - [Log] lTime = 1261864899078
4    26-12-09 20:48:21 - [Log] lTime = 1261860501033
5    26-12-09 20:48:21 - [Log] lTime = 1261860501069

如您所見,第3行存在問題。時間磨損是錯誤的。 它應該在1261860501012和1261860501033之間。大約有73毫秒的誤差。

有人知道問題來自哪里?

非常感謝

bill0ute

編輯:操作系統:Debian 4.0,Java:6_17。

我的代碼:

while (true) 
    setLog (System.currentTimeMillis ());

編輯:程序在基於Linux的VPS上運行

System.currentTimeMillis()依賴於系統時鍾。 看起來系統時鍾已被外部程序微調,對於可能是NTP的 Linux。

請注意,您不應使用System.currentTimeMillis()來測量已用時間。 最好使用System.nanoTime()但即使這樣也不能保證是單調的。

首先,你有一個小錯字,它是73毫秒,而不是秒(那將是令人不安的:-))。

為了達到這一點,您應該知道Java是一種非常高級的語言,只能訪問通過本機函數調用提供給您的系統函數。 這些調用是由您的虛擬機實現的,並且有很多(Sun,Open,Dalvik ..),所以不能給出一般建議,但返回時間currentTimeMillis取決於許多東西,如線程(在VM和本機線程中),板載計時器等的分辨率。我承認結果很奇怪,但除非你高度依賴於他們的正確順序,否則我不會打擾而只是生活在異常中十分之一秒的范圍。

如果您需要更具體的建議,請粘貼一些源代碼!

編輯:

在看過您的源代碼之后,我非常確定您的Log函數使用某種優先級處理或線程,這會導致錯誤的結果。 只是嘗試分配有問題的方法的返回值,並將該變量傳遞給您的日志:

long foo = System.currentTimeMillis();
setLog(foo); 

我們曾經看過類似的東西,在Ubuntu上運行AMD64x2芯片。 如果你還有芯片,我會開始尋找。

有問題的方法取決於系統時鍾,系統時鍾可能有問題。 有關通過ntpd(8)守護程序保持系統時鍾准確的問題的討論,請參見http://support.ntp.org/bin/view/Support/KnownOsIssues

我還建議http://www.vmware.com/pdf/vmware_timekeeping.pdf討論VMWare中系統時鍾的准確性。 它對系統時鍾的討論也很普遍。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM