2011-01-26 112 views
1

如果我會寫一個時鐘應用程序,我需要增加short seconds字面值每秒鐘後我可以依靠Thread.sleep(1000)方法嗎?什麼是計算時間跨度的最佳方法?

將它正常工作,如果我將有百萬同時運行的時鐘?

+2

@AndriodNoob,這個問題是最適合的StackOverflow,不是P.SE – 2011-01-26 19:34:18

回答

2

不,你不能依靠了Thread.sleep(1000),因爲它是到CPU調度程序來當你的線程實際是下一次運行。

最重要的是,CPU時序是不完全準確的,所以你會得到真正的從自然時間偏差,除非你一個適當的時間服務(原子鐘)同步。儘管如此,如果你確實打算運行'數百萬個時鐘',那麼最好有一個正在更新的計時器,並且僅在每個時鐘實例中存儲該計時器的偏移量。

而且,通過還原線程睡眠的時間和更新秒只作爲適當,可以增加你的準確度。不過請注意,如上所述,睡眠時間爲不保證。這意味着即使您要求它睡10ms,技術上也有可能在10秒內不返回(或者,<<insert arbitrary time here>>

0

您通常希望每秒至少更新一次秒數,否則它可以是幾乎整個第二不同步的實時時鐘。

如果可能的話,從那裏你想有隻一個線程睡眠和更新seconds值,並有事件的優先級隊列需要提供服務每次更新,時鐘都會查看優先級隊列前面的事件,如果您已經到了它的時間,則對其進行處理並檢查下一個。

0

查看Java Concurrent API包。有許多新的API處理多線程和非阻塞算法。

例如,而不是你的程序調用了Thread.sleep(1000),你可以建立一個[ScheduledExecutorService的] [1],並安排運行每秒的任務。這會調用你的代碼,並用它來更新你的時鐘滴答。這將您的代碼移到更多的生產者/消費者模型中。

與Java 5,需要這樣的低級別的訪問線程(即等待/通知)得到緩解。看看在Java併發包了一些新的東西

[1]:http://download.oracle.com/javase/6/docs/api/java/util/concurrent/ScheduledExecutorService.html#scheduleAtFixedRate(java.lang.Runnable,很長很長,java.util.concurrent.TimeUnit中)

相關問題