« JUST Suite 2007 発売延期 | Main | Ys 20周年 »

2007.02.10

ScheduledThreadPool

 Java5で追加された便利なjava.util.concurrentパッケージのクラス群。ある処理を一定のタイミングで繰り返し実行する場合、Java1.4まではjava.util.Timerあるいはjavax.swing.Timerを用いていましたが、前者の場合TimerTaskを継承したクラスを使用する必要がありますし、後者の場合はActionListenerを実装する必要があったり、「固定頻度実行」と「固定遅延実行」(java.util.TimerのJavaDoc中の単語より引用)を切り替えて実行できなかったりしました(もっとも、javax.swing.TimerはGUIに対して安全にアクセスできるというメリットもありますが)。

 ScheduledExecutorServiceを使用すると、Runnableを実装したクラスを使用できるので、処理を記述するクラスの自由度はjava.util.Timerを用いた場合より高まりますし、「固定頻度実行」「固定遅延実行」も簡単に切り替えることができますし。
 ってことで、プールのサイズが2のScheduledThreadPoolを作成し、固定頻度実行・固定遅延実行のスレッドをそれぞれ1つずつ投げ込んで様子を見るテストクラスを作成してみました。

 なお、スレッドプール関係の内容はJava in the BoxConcurrency Utilities その一 非同期処理の巻に詳しく書かれています(自分もそこで勉強しました)。

package thread;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/**
 * ScheduledThreadPoolでAtFixedRateとWithFixedDelayを
 * 同時に投げ込んで様子を見るテストクラス。
 */
public class ThreadTest {
 /**
  * メイン・エントリポイント。
  * @param args
  * @throws Exception
  */
 public static void main(String[] args) throws Exception {
  new ThreadTest().execute();
 }
 /**
  * ScheduledThreadPoolにスレッドを投げ込みます。
  * @throws Exception
  */
 private void execute() throws Exception {
  ScheduledExecutorService exe = Executors.newScheduledThreadPool(2);
  exe.scheduleAtFixedRate(new WaitThread("FixedRate "), 0, 5, TimeUnit.SECONDS);
  exe.scheduleWithFixedDelay(new WaitThread("FixedDelay"), 0, 5, TimeUnit.SECONDS);
 }
 /**
  * 1~5秒間待機するスレッドクラス。
  */
 private class WaitThread implements Runnable {
  /**
   * スレッド名
   */
  private String name;
  /**
   * 乱数シード
   */
  private Random random = new Random();
  /**
   * 名前を指定してスレッドを初期化します。
   * @param name
   */
  public WaitThread(String name) {
   this.name = name;
  }
  /**
   *
   */
  public void run() {
   try {
    String s = new SimpleDateFormat("HH:mm:ss").format(new Date());
    int w = random.nextInt(5)+1;
    Thread.sleep( w * 1000);
    System.out.println(
      s +
      ", " +
      name +
      ", " +
      w +
      " 秒間待機");
   } catch (Exception e) { e.printStackTrace(); }
  }
 }
}

で、実行してみた結果。

11:18:28, FixedDelay, 2 秒間待機
11:18:28, FixedRate , 5 秒間待機
11:18:33, FixedRate , 4 秒間待機
11:18:35, FixedDelay, 3 秒間待機
11:18:38, FixedRate , 5 秒間待機
11:18:43, FixedDelay, 2 秒間待機
11:18:43, FixedRate , 5 秒間待機
11:18:48, FixedRate , 2 秒間待機
11:18:50, FixedDelay, 4 秒間待機
11:18:53, FixedRate , 4 秒間待機
11:18:58, FixedRate , 5 秒間待機
11:18:59, FixedDelay, 4 秒間待機
11:19:03, FixedRate , 3 秒間待機
11:19:08, FixedDelay, 2 秒間待機
11:19:08, FixedRate , 5 秒間待機
11:19:13, FixedRate , 3 秒間待機
11:19:15, FixedDelay, 3 秒間待機

ちゃんと、FixedRateだと「固定頻度」で実行、FixedDelayだと「固定遅延」で実行されていますね。まぁ、同時実行しただけでこの原則が崩れてしまわれても困ってしまいますが(^^;

|

« JUST Suite 2007 発売延期 | Main | Ys 20周年 »

Java」カテゴリの記事

プログラム」カテゴリの記事

Comments

Post a comment



(Not displayed with comment.)


Comments are moderated, and will not appear on this weblog until the author has approved them.



TrackBack


Listed below are links to weblogs that reference ScheduledThreadPool:

« JUST Suite 2007 発売延期 | Main | Ys 20周年 »