34.
タイマー処理
Timerクラス
Timerクラス
Timerクラスはスケジュール(指定時間や時間間隔)を使って、バックグラウンドで実行するスレッド処理です。
インスタンス
newすると、新規タイマーが生成されます。引数のbooleanは、デーモンで実行するかどうかを設定します。
new Timer(boolean isDaemon)
ユーザスレッド
ユーザースレッドは、タスクを完了するのを待ってから終了する、優先度の高いスレッドです。
デーモンスレッド
デーモンスレッドは、すべてのユーザースレッドが終了すると自動的に終了するスレッドです。
schedule()
schedule() メソッドを実行すると、指定した時刻で run() メソッドを実行します。第2引数はデータ型によって処理が異なります。
指定時刻に実行
指定した時刻に1度だけ実行します。現在より過去の時刻を設定すると即座に実行します。
schedule(TimerTask task, Date time)
第3引数を指定すると、指定した時間間隔(ミリ秒)で実行します。
schedule(TimerTask task, Date firstTime, long period)
現在から指定時刻後に実行
現在時刻から、指定時間(ミリ秒)後に1度だけ実行します。
schedule(TimerTask task, long delay)
第3引数を指定すると、指定した時間間隔(ミリ秒)で実行します。
schedule(TimerTask task, long delay, long period)
cancel()
cancel() メソッドはタイマーを終了します。
cancel();
TimerTaskクラス
TimerTaskクラスは時間を指定して処理します。タイマー処理を実行するには、run() メソッドを必ず指定します。
TimerTask task = new TimerTask() {
public void run() {
//タイマー設定後の処理
}
};
現在から指定時刻後に実行
現在から3秒後に処理をするプログラムです。
TimerApp.java
package sample;
import java.util.Timer;
import java.util.TimerTask;
public class TimerApp {
public static int seconds = 3;
public static void main(String[] args) {
System.out.println(seconds + "秒後に実行します。");
Timer timer = new Timer();
TimerTask task = new TimerTask() {
public void run() {
System.out.println("実行しました!");
//タイマー停止
timer.cancel();
}
};
//ms に変換
int ms = seconds * 1000;
//タイマー実行
timer.schedule(task, ms);
}
}
時間指定で実行
時間指定で1回実行
開始時刻を指定して1回実行してみます。
Dateオブジェクト生成
日時はCalendarクラスで日時生成し、Dateオブジェクトに変換します。
DateTimerApp.java
package timer;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class DateTimerApp {
public static void main(String[] args) throws ParseException {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, 2023);
calendar.set(Calendar.MONTH, 6);
calendar.set(Calendar.DATE, 3);
calendar.set(Calendar.HOUR_OF_DAY, 12);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
Date scheduledTime = calendar.getTime();
}
}
- MONTHは、数字が1つ小さいので注意
タイマー実行
Timer.schedule()に、TimerTaskオブジェクトとDateオブジェクトを代入します。以下は「2023/07/03 12:00:00」に実行されます。
DateTimerApp.java
package timer;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class DateTimerApp {
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, 2023);
calendar.set(Calendar.MONTH, 6);
calendar.set(Calendar.DATE, 3);
calendar.set(Calendar.HOUR_OF_DAY, 12);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
Date scheduledTime = calendar.getTime();
Timer timer = new Timer();
TimerTask task = new TimerTask() {
@Override
public void run() {
System.out.println("タイマーが実行されました。");
timer.cancel();
}
};
timer.schedule(task, scheduledTime);
}
}
結果
タイマーが実行されました。
指定時間から定期間隔で実行
DateTimerApp.java
package timer;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class DateTimerApp {
public static long interval = 3;
public static long count = 0;
public static long maxCount = 5;
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, 2023);
calendar.set(Calendar.MONTH, 6);
calendar.set(Calendar.DATE, 3);
calendar.set(Calendar.HOUR_OF_DAY, 12);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
Date scheduledTime = calendar.getTime();
Timer timer = new Timer();
TimerTask task = new TimerTask() {
@Override
public void run() {
System.out.println("タイマーが実行されました。");
count++;
if (count > maxCount) {
timer.cancel();
System.out.println("終了");
}
}
};
timer.schedule(task, scheduledTime);
}
}
結果
タイマーが実行されました。