2011-08-01 62 views
2

下面的代碼是改編自一個例子,實時Java平臺編程由Peter C.穴播:實時爪哇 - 異步事件處理程序不火

import javax.realtime.*; 
public class OSTimer { 

    static volatile boolean cont = true; 

    public static void main(String[] args) { 
    AsyncEventHandler handler = new AsyncEventHandler(){ 
     public void handleAsyncEvent() { 
      System.out.println("Stopping..."); 
      cont = false;     
     } 
     } 
    }; 

    OneShotTimer timer = new OneShotTimer(new RelativeTime(3000, 0), handler); 
    timer.start(); 

    while(cont){ 
    System.out.println("Running"); 
    if (timer.isRunning()) System.out.println("Timer is running"); 
    try { 
     Thread.sleep(1000); 
    } catch(Exception e) { } 
    } 
    System.exit(0); 
} 

的程序應該是3運行秒,然後退出。但是,輸出顯示,雖然計時器在3秒後確實停止,程序繼續像往常一樣,即輸出爲:

Running 
Timer is running 
Running 
Timer is running 
Running 
Timer is running 
Running 
Running 
Running...... 

顯然,處理不火,而我不知道爲什麼。另一個涉及週期性定時器觸發處理程序的示例程序確實按預期工作。程序結構與此處的程序結構幾乎相同。

+0

是你真正的代碼?看起來你缺少一個參數(一個Clock)給你的Timer構造函數。 (還有與真實代碼有什麼不同嗎?)另外,你在使用什麼虛擬機? – andersoj

+0

哎呀,從頭開始,有一個'無時鐘'的構造函數 – andersoj

+0

你是否嘗試過從主線程(我知道你不應該)在計時器上調用'fire()'。 – andersoj

回答

0

有幾件事情嘗試:

  1. 呼叫fire()明確的計時器實例,看看是否可以強制事情
  2. 嘗試通過在邏輯傳遞作爲Runnable對象處理程序創建的處理程序。 API在這方面有點不清楚,但這是我過去指定處理程序的方式。

例子:

AsyncEventHandler handler = new AsyncEventHandler(new Runnable() { 
    public void run() { 
     System.out.println("Stopping..."); 
     cont = false;     
    } 
    });