Timerクラス
タイマーで定期処理する – Timerクラス- public void schedule(TimerTask task, long delay, long period)
- public void scheduleAtFixedRate(TimerTask task, long delay, long period)
- task:定期実行するタスク
- delay:タスクを実行する前の遅延時間(ミリ秒)
- period:タスクを実行する間隔(ミリ秒)
一定間隔で、決められた処理を繰り返し実行したいならば、Timerクラス(java.utilパッケージ)のscheduleAtFixedRateメソッドを利用します。引数には、実行すべき処理(TimerTaskオブジェクト)、開始時刻(ミリ秒)、実行スパン(ミリ秒)の順で指定します。
UtilTimer.java
Timer t = new Timer(); t.scheduleAtFixedRate(new TimerTask() { @Override public void run() { System.out.println(new Date()); } }, 0, 500); try { Thread.sleep(5000); // 定期実行を待って休止 } catch (InterruptedException e) { e.printStackTrace(); } t.cancel();
Mon Jan 06 08:28:48 JST 2020 Mon Jan 06 08:28:48 JST 2020 Mon Jan 06 08:28:49 JST 2020 Mon Jan 06 08:28:49 JST 2020 Mon Jan 06 08:28:50 JST 2020 ...後略...
似たメソッドとしてscheduleメソッドもあります。scheduleAtFixedRateメソッドとの違いは、処理時間が処理間隔(引数period)を超えた場合の挙動に違いがあります。まず、scheduleメソッドは常に「直前の処理の開始時間」を基点とします。よって、初回の処理が遅延し、2回目の処理開始が遅れた場合、、3回目の開始時間も遅れます。
一方、scheduleAtFixedRateメソッドは常に「初回の処理の開始時間」を基点とします。よって、初回の処理が遅延して、2回目の処理開始が遅れたとしても、3回目の処理は遅れを取り戻そうと、処理間隔を縮めて開始しようとします。