【Java】 ScheduledExecutorService ~スケジューラ~

ScheduledExecutorServiceインターフェース

`#`クラス名概要
1newSingleThreadScheduledExecutor一つのスレッドでタスク処理を行う
2newScheduledThreadPoolタスクを処理するスレッドの数を指定できる

scheduleWithFixedDelay()

 * 指定された初期遅延経過後に指定したタスクを実行し、以後、定期的にそのタスクを繰り返す

■イメージ図

 |                【Task処理】                  【Task処理】                  【Task処理】
 |<-- 初期遅延 -->|     |<----- Delay ---->|     |<----- Delay ---->|

scheduleAtFixedRate()

 * 指定された初期遅延経過後に指定したタスクを実行し、以後、定期的にそのタスクを繰り返す

■イメージ図

 |                【Task処理】                  【Task処理】                  【Task処理】
 |<-- 初期遅延 -->|<---------- Period --------->|<---------- Period --------->|

schedule()

 * 指定された遅延後に実行

サンプル

 * 初期遅延(サンプルだと5秒)経過後に、定期的(サンプルだと3秒)に
   タスクタイマー(SampleTaskTimer)を実行する

SampleScheduledService.java

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class SampleScheduledService {
   ScheduledExecutorService scheduler =
         Executors.newSingleThreadScheduledExecutor();
   
   public void start() {
      // 初期遅延(5秒)経過後に、定期的(3秒)にSampleTaskTimerを実行する
      this.scheduler.scheduleWithFixedDelay(
            new SampleTaskTimer(), 5, 3, TimeUnit.SECONDS);
   }
   
   public void stop() {
      this.scheduler.shutdown();
   }
}

SampleTaskTimer.java

import java.text.SimpleDateFormat;
import java.util.TimerTask;

public class SampleTaskTimer extends TimerTask {
   private SimpleDateFormat simpleDateFormat = new SimpleDateFormat(
         "HH:mm:ss SSS");
   @Override
   public void run() {
      System.out.println("Time       : "+ simpleDateFormat.format(System.currentTimeMillis()));
   }

}

Main.java

import java.text.SimpleDateFormat;

public class Main {

   public static void main(String[] args) {
      SimpleDateFormat simpleDateFormat = new SimpleDateFormat(
            "HH:mm:ss SSS");
      
      System.out.println("Start Time : " + simpleDateFormat.format(System.currentTimeMillis()));
      
      SampleScheduledService service = new SampleScheduledService();
      
      service.start();
      
      try {
         Thread.sleep(60000);
      } catch (InterruptedException ignore) {
      }
      
      service.stop();
      System.out.println("End Time   : " + simpleDateFormat.format(System.currentTimeMillis()));
   }

}

出力結果

Start Time : 02:03:27 894
Time       : 02:03:32 901
Time       : 02:03:35 903
Time       : 02:03:38 904
Time       : 02:03:41 905
Time       : 02:03:44 906
Time       : 02:03:47 907
Time       : 02:03:50 908
Time       : 02:03:53 909
Time       : 02:03:56 909
Time       : 02:03:59 910
Time       : 02:04:02 911
Time       : 02:04:05 912
Time       : 02:04:08 913
Time       : 02:04:11 914
Time       : 02:04:14 915
Time       : 02:04:17 916
Time       : 02:04:20 917
Time       : 02:04:23 919
Time       : 02:04:26 920
End Time   : 02:04:27 901


関連記事

java.util.concurrent

java.util.concurrent について

http://blogs.yahoo.co.jp/dk521123/32538961.html

CountDownLatch ~カウントダウンラッチ~

http://blogs.yahoo.co.jp/dk521123/33538428.html

ExecutorService

http://blogs.yahoo.co.jp/dk521123/33665815.html

ScheduledExecutorService ~スケジューラ~

http://blogs.yahoo.co.jp/dk521123/33934102.html

タイマー

TaskTimer

http://blogs.yahoo.co.jp/dk521123/33926465.html