山下寛人オフィシャルブログ

オイシックス株式会社 執行役員 システム本部長 山下寛人の公式ブログです。

Javaのタイマー処理で一時停止・再開

Javaで一定時間ごとに何かの処理をするときには

java.util.Timer

java.util.TimerTask

を使う方法があります。

しかしこれらのクラスを使う場合「一時停止・再開」が

非常に難しいです。

基本的にはこれらのクラスではサポートされていないので

いったんタイマーを破棄して途中の状態は別途持っておいて

再度タイマーを開始する形になります。


しかし

java.util.concurrent.ScheduledExecutorService

を使えばそんな処理も簡単に実装することができます。


やり方の概要は以下のとおり。

Runnableインターフェースをimplementしたクラスを作る。

runメソッドに定期的に実行したい処理を実装。

Executors.newSingleThreadScheduledExecutor() で

ScheduledExecutorService のインスタンスを取得。

そのScheduledExecutorServiceのscheduleAtFixedRate()メソッド

Runnableのインスタンスを渡す。

ScheduledFuture のインスタンスが返ってくる。

定期的に実行される。


コードのイメージ。


public class MyTask implements Runnable {
public void run() {
定期的に実行したい処理
}
}

Runnable task = new MyTask();
ScheduledExecutorService scheduler =
Executors.newSingleThreadScheduledExecutor();
ScheduledFuture future =
scheduler.scheduleAtFixedRate(task, 0, 10, TimeUnit.MILLISECONDS);



定期実行を終了したい場合は

scheduler.shutdown();

とします。


一時停止は

future.cancel(true);

とします。

再開する場合はtaskを再度schedulerに登録し直します。