サンプル
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インタフェース実装オブジェクト
参考文献
http://www.atmarkit.co.jp/fjava/javatips/078java008.htmlhttp://www.02.246.ne.jp/~torutk/javahow2/timer.html#doc1_id89