Javaのタイマーとタスクの例
Javaのjava.util.Timerは、将来の特定の時点でスレッドの実行をスケジュールするために使用できるユーティリティクラスです。Java Timerクラスは、タスクを一度だけ実行するか、定期的な間隔で実行するために使用することができます。
Javaのタイマータスク
java.util.TimerTaskは、Runnableインターフェースを実装した抽象クラスであり、私たちがJavaのTimerクラスを使用してスケジュールを設定できる独自のTimerTaskを作成するためにこのクラスを拡張する必要があります。
Javaのタイマーの例
JavaのTimerクラスはスレッドセーフであり、複数のスレッドが外部の同期を必要とせずに単一のTimerオブジェクトを共有することができます。Timerクラスはjava.util.TaskQueueを使用して、指定された定期間隔でタスクを追加し、いつでも一度に1つのスレッドがTimerTaskを実行している状態になります。たとえば、10秒ごとに実行するTimerを作成している場合でも、単一のスレッドの実行には20秒かかる場合、Timerオブジェクトはタスクをキューに追加し続け、1つのスレッドが終了するとキューに通知が行われ、別のスレッドが実行を開始します。JavaのTimerクラスは、オブジェクトのwaitメソッドとnotifyメソッドを使用してタスクをスケジュールします。以下にJavaのTimerとTimerTaskの例のシンプルなプログラムを示します。
package com.scdev.threads;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class MyTimerTask extends TimerTask {
@Override
public void run() {
System.out.println("Timer task started at:"+new Date());
completeTask();
System.out.println("Timer task finished at:"+new Date());
}
private void completeTask() {
try {
//assuming it takes 20 secs to complete the task
Thread.sleep(20000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String args[]){
TimerTask timerTask = new MyTimerTask();
//running timer task as daemon thread
Timer timer = new Timer(true);
timer.scheduleAtFixedRate(timerTask, 0, 10*1000);
System.out.println("TimerTask started");
//cancel after sometime
try {
Thread.sleep(120000);
} catch (InterruptedException e) {
e.printStackTrace();
}
timer.cancel();
System.out.println("TimerTask cancelled");
try {
Thread.sleep(30000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
1つのスレッドの実行には20秒かかりますが、Javaのタイマーオブジェクトはタスクを10秒ごとに実行するようにスケジュールされています。以下はプログラムの出力です。
TimerTask started
Timer task started at:Wed Dec 26 19:16:39 PST 2012
Timer task finished at:Wed Dec 26 19:16:59 PST 2012
Timer task started at:Wed Dec 26 19:16:59 PST 2012
Timer task finished at:Wed Dec 26 19:17:19 PST 2012
Timer task started at:Wed Dec 26 19:17:19 PST 2012
Timer task finished at:Wed Dec 26 19:17:39 PST 2012
Timer task started at:Wed Dec 26 19:17:39 PST 2012
Timer task finished at:Wed Dec 26 19:17:59 PST 2012
Timer task started at:Wed Dec 26 19:17:59 PST 2012
Timer task finished at:Wed Dec 26 19:18:19 PST 2012
Timer task started at:Wed Dec 26 19:18:19 PST 2012
TimerTask cancelled
Timer task finished at:Wed Dec 26 19:18:39 PST 2012
出力は、タスクが既に実行されている場合、タイマーはそれが終了するまで待機し、終了したら次のタスクをキューから再開することを確認しています。 Javaのタイマーオブジェクトはデーモンスレッドとして関連するタスクを実行するために作成できます。 Timerのcancel()メソッドはタイマーを終了し、予定されたタスクを破棄しますが、現在実行中のタスクには干渉せず、終了を許容します。タイマーがデーモンスレッドとして実行されている場合、キャンセルしていない場合でも、すべてのユーザースレッドの実行が終了するとすぐに終了します。 Timerクラスには、指定された日付に一度だけタスクをスケジュールするためのいくつかのschedule()メソッドが含まれています。一定の間隔でタスクを定期的に実行するためのいくつかのscheduleAtFixedRate()メソッドもあります。 Timerを使用してタスクをスケジュールする際には、通常のスレッドの実行時間よりも長い間隔にする必要があります。さもないと、タスクのキューサイズが増え続け、最終的にタスクが常に実行されることになります。以上、Javaのタイマーとタイマータスクのクイックなまとめでした。