トップ 一覧 置換 検索 ヘルプ RSS ログイン

java でタイマーを使うの変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
Java には大きく分けて2種類のタイマーがある。
 java.util.Timer
 javax.swing.Timer

!タイマーを使わずに一定間隔で処理を行う
特徴
*次の処理開始までの時間=現在の処理にかかった時間+ウエイト時間
*前の処理の終了から次の処理の開始までの時間が一定
*ゲーム等ではオススメしない。

  class TimerTest3 implements Runnable {
    long current;
    long old;
    public TimerTest3(){
      Thread th = new Thread(this);
      old = System.currentTimeMillis();
      th.start();
    }
    
    public void run() {
      while (true) {
        current = System.currentTimeMillis();
        System.out.println(current - old);
        old = current;
        
        try {
          Thread.sleep((int)(Math.random() * 1500));
        } catch (Exception ex){
        }
        
        try {
          Thread.sleep(1000);
        } catch (Exception ex){
        }
      }
    }
  }

!java.util.Timerを使う
特徴
*色々な設定が出来る
*schedule の場合
**実行が遅延した場合、そのあとの実行も遅延されます。
**最終的に、実行の頻度は通常、指定した期間の対応する頻度よりも若干遅くなります
**アニメーションタスクやユーザの入力に応じて一定の活動が実行されるタスクに適している
**個人的にはゲームにオススメ
*scheduleAtFixedRateの場合
**実行が遅延した場合、「遅れを取り戻す」ために 2 つ以上の実行が連続して行われます
**最終的に実行の頻度は、指定した期間の対応する頻度と同じになります
**「絶対」時間を反映する作業を繰り返すのに適しています。

  class TimerTest2   {
    long current;
    long old;
    public TimerTest2(){
      Timer timer = new Timer(true);
      old = System.currentTimeMillis();
      timer.schedule(new TestTask(this), 1000,1000);
      // timer.scheduleAtFixedRate(new TestTask(this), 1000,1000);
    }
    
    public void actionPerformed(ActionEvent e){
    }
    
    public void process(){
      current = System.currentTimeMillis();
      System.out.println(current - old);
      old = current;
      
      try {
        Thread.sleep((int)(Math.random() * 1500));
      } catch (Exception ex){
      }
    }
    
    static class TestTask extends TimerTask {
      TimerTest2 tt;
      public TestTask(TimerTest2 tt){
        this.tt = tt;
      }
      
      public void run(){
        tt.process();
      }
    }
  }

!javax.swing.Timer
特徴
*実行が遅延した場合、次の実行時間まで待ちます。
*あまりオススメしない。
class TimerTest1 implements ActionListener {
    long current;
    long old;
    public TimerTest1(){
      Timer timer = new Timer(1000,this);
      old = System.currentTimeMillis();
      timer.start();
    }
    
    public void actionPerformed(ActionEvent e){
      current = System.currentTimeMillis();
      System.out.println(current - old);
      old = current;
      
      try {
        Thread.sleep((int)(Math.random() * 1500));
      } catch (Exception ex){
      }
    }
  }
{{category2 プログラミング言語,Java}}