トップ 差分 一覧 ソース 置換 検索 ヘルプ PDF 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){
     }
   }
 }
[カテゴリ: プログラミング言語 > Java]

[通知用URL]



  • Hatenaブックマークに追加
  • livedoorクリップに追加
  • del.icio.usに追加
  • FC2ブックマークに追加

最終更新時間:2009年11月13日 19時09分37秒