2

次のコードは、Peter C. Dibble による Real-Time Java Platform Programming の例を基にしています。

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......

明らかにハンドラーが起動しませんでした。その理由はわかりません。ハンドラーをトリガーする定期的なタイマーを含む別のサンプル プログラムは、期待どおりに動作します。プログラムの構成はこちらとほぼ同じです。

4

1 に答える 1

1

試してみるいくつかのこと:

  1. タイマー インスタンスを明示的に呼び出しfire()て、強制できるかどうかを確認します。
  2. ロジックをRunnableオブジェクトとしてハンドラーに渡して、ハンドラーを作成してみてください。APIはこれについて少し不明確ですが、これは私が過去にハンドラーを指定した方法です。

例:

AsyncEventHandler handler = new AsyncEventHandler(new Runnable() {
    public void run() {
      System.out.println("Stopping...");
      cont = false;                  
    }
  });
于 2012-05-09T19:48:20.490 に答える