【Java】TaskTimer

Timer

利点

 * Threadと違って、周期的/一定時間の経過判定を管理する必要がない

サンプル

SampleTask.java

import java.text.SimpleDateFormat;
import java.util.Timer;
import java.util.TimerTask;

class SampleTimerTask extends TimerTask {
   private SimpleDateFormat simpleDateFormat = new SimpleDateFormat(
         "HH:mm:ss SSS");
   private volatile boolean isFirst = true;
   private volatile int taskNum = 1;

   public void run() {
      System.out.println(taskNum + " "
            + simpleDateFormat.format(System.currentTimeMillis()));
      taskNum++;
      if (isFirst) {
         isFirst = false;
         try {
            // 1回目のタスクの実行には2000ミリ秒かかる
            Thread.sleep(2000);
         } catch (InterruptedException ignore) {
         }
      }
   }
}

public class SampleTask {
   public static void main(String[] args) {
      System.out.println("schedule()");
      Timer scheduleTimer = new Timer();
      // タスクの実行間隔は1000ミリ秒
      scheduleTimer.schedule(new SampleTimerTask(), 0, 1000);
      try {
         Thread.sleep(5000);
      } catch (InterruptedException ignore) {
      }
      scheduleTimer.cancel();

      System.out.println("scheduleAtFixedRate()");
      Timer scheduleAtFixedRateTimer = new Timer();
      // タスクの実行間隔は1000ミリ秒
      scheduleAtFixedRateTimer.scheduleAtFixedRate(
            new SampleTimerTask(), 0, 1000);
      try {
         Thread.sleep(5000);
      } catch (InterruptedException ignore) {
      }
      scheduleAtFixedRateTimer.cancel();
   }
}

出力結果

schedule()
1 23:36:30 689
2 23:36:32 691
3 23:36:33 692
4 23:36:34 693
scheduleAtFixedRate()
1 23:36:35 691
2 23:36:37 691
3 23:36:37 691
4 23:36:38 692
5 23:36:39 692
6 23:36:40 692

主なメソッド

schedule()

 * 周期的にタスクを実行させる
 * 実行に遅れが生じても、その次の実行までの周期(間隔)は指定された値を使用

使いどころ

 * アニメーションの画面更新処理

scheduleAtFixedRate()

 * 周期的にタスクを実行させる
 * 実行に遅れが生じた場合、遅れを取り戻すようにスケジューリングする

使いどころ

 * 時計/ストップウォッチを実装したい場合
 * ある期間に一定回数の処理をさせたい場合

引数/戻り値

■引数の1番目
 Runnableインタフェースを実装したオブジェクト
■引数の2番目
 scheduleAtFixedRate()呼び出し後から最初のタスクを実行するまでの準備期間[ms]を指定
■引数の3番目
 タスクを実行する周期[ms]を指定
■引数の4番目(オプション)
 引数(2番目と3番目)で指定している値の単位を示す列挙型TimeUnitの値を指定
■戻り値
 登録したタスクを表わすScheduledFutureインタフェース実装オブジェクト


関連記事

java.util.concurrent

java.util.concurrent について

http://blogs.yahoo.co.jp/dk521123/32538961.html

CountDownLatch ~カウントダウンラッチ~

http://blogs.yahoo.co.jp/dk521123/33538428.html

ExecutorService ~スレッドプール / ThreadPool~

http://blogs.yahoo.co.jp/dk521123/33665815.html

ScheduledExecutorService ~スケジューラ~

http://blogs.yahoo.co.jp/dk521123/33934102.html

タイマー

TaskTimer

http://blogs.yahoo.co.jp/dk521123/33926465.html