2013-05-18 82 views
7

與Timer有關的網站上的文章討論如何使用Timer進行編程。計算機如何實現Java Timer?

我問另外一個問題。 Java如何執行Timer方法?

由於不用循環來檢查當前時間是否是需要的時間點,所以避免了耗時的工作,我認爲Timer並沒有簡單地通過使用while循環來實現,以持續檢查和比較當前時間時間到了所需的時間點。

謝謝!

+2

1.轉到[OpenJDK源碼回購](http://hg.openjdk.java.net/); 2.尋找答案; 3.; 4.利潤。 – TC1

+0

利潤?這是什麼意思? – user1914692

+1

這是對此的參考:http://www.youtube.com/watch?v = tO5sxLapAts –

回答

1

根據適用於Javadoc

此類不提供實時保證:它調度任務 使用的Object.wait(long)方法。

如果你看看代碼,你會發現一個稱爲主循環的方法。第一行幾行復制如下。

private void mainLoop() { 
    while (true) { 
     try { 

而且它在它內部使用一個while循環以及Object.wait()來做等待。

+0

謝謝。那麼Object.wait()是如何實現的?我仍然假設它不使用while循環。 – user1914692

+0

Object.wait()是一個「內置」方法,它是用本地代碼實現的,而不是在Java中,它使用底層操作系統的設施來暫停執行一個線程(所以OS的調度程序不會給它任何CPU時間) –

+0

非常感謝!這就是我的想法。尋找答案,那麼操作系統如何在沒有CPU時間的情況下實現它?任何鏈接,以便我可以找到參考? – user1914692

2

我認爲定時器不是簡單地通過使用while循環來實現 檢查和比較當前時間到所需的時間點。

是的,它是。唯一的優化是;它正在使用基於nextExecutionTime的優先級隊列來執行任務。

JavaDoc的狀態

定時器對象是用來 執行所有的定時器的任務,依次單個後臺線程。計時器任務應該快速完成,即 。如果一個計時器任務需要花費過多的時間才能完成,它會「佔用」計時器的任務執行線程。這可以反過來,延遲 的後續任務的執行

Timer類包含

  1. TaskQueue這是TimerTasks的優先級隊列,下令nextExecutionTime。
  2. TimerThread(queue)定時器的任務執行線程,它等待(queue.wait())定時器隊列上的任務。

TimerThreadprivate void mainLoop() {
其中連續while(true)將繼續通過與currentTimeMillis

    currentTime = System.currentTimeMillis(); 
        executionTime = task.nextExecutionTime; 
        if (taskFired = (executionTime<=currentTime)) { 

比較nextExecutionTime檢查任務,如果達到,然後調用

  if (taskFired) // Task fired; run it, holding no locks 
       task.run(); 
+0

如果Java Timer使用循環,那麼定時器有多精確? – user1914692