簡體   English   中英

Java計時,System.nanoTime()比System.currentTimeMillis()更糟糕,但它是否會在睡眠中持續存在?

[英]Java timing, System.nanoTime() batter than System.currentTimeMillis() but does it persist over sleep?

我正在嘗試實現一個計時器,它可能用於短(秒)事件或更長(小時等)的事件。

理想情況下,它應該在CPU關閉的時間段內持續存在,例如,電池已經耗盡。 如果我使用System.currentTimeMillis()和結束時間使用相同的函數設置開始時間,它幾乎適用於所有情況,除非在閏秒,閏年,夏令時變化等期間...或者,如果用戶只是改變時間(我已經驗證了這一點)。 這是在Android系統上,順便說一句。

相反,如果我使用System.nanoTime(),除了可能更准確,它將不會有通常的“困難時間”問題與時間的變化等。我的問題是,System.nanoTime()測量納秒來自一些任意的時間,在“艱難時期”? 我不確定正確的術語是什么,但是例如,System.nanoTime()會在X處運行,然后是X + 1小時后,系統會關閉(例如Android設備上的電池耗盡),然后是X +10小時,系統啟動,此時運行System.nanoTime()會返回10個小時? 或者它會返回1小時(因為當系統關閉/睡眠時,nanoTime使用的“計數器”可能無法運行?)。

android.os.SystemClock.elapsedRealtime() - 自系統啟動以來的毫秒數,包括在睡眠狀態下花費的時間。 這應該是你最好的選擇。

我不認為你可以測量android中的關閉時間。

有關更多信息,最好檢查android系統時鍾頁面。 http://developer.android.com/reference/android/os/SystemClock.html

是未定義的

“返回的值表示納秒,因為某些固定但任意的原始時間(可能在未來,因此值可能是負數)。在Java虛擬機的實例中,此方法的所有調用都使用相同的原點;其他虛擬機實例可能會使用不同的來源。“

為簡單起見,我們會說當你在時間X運行它時,原點是X(這是允許的)。 這意味着它將返回0,然后在VM實例中,時間將以與正常時鍾相同的速率流逝。

當您使用Thread.sleep時,它不會更改VM實例,因此不會對其進行特殊處理。

但是,重新啟動設備后,您將處於不同的VM實例中。 因此,X不再保證是原點。

暫無
暫無

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

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