別のタイプのタスク プールは、スケジュールされたタスク プールです。名前から判断すると、特定のタスクをいつ起動するかをスケジュールするためにこのタイプを使用すると推測できます。

このタイプのサービスは、一定の時間が経過した後にアクティビティを起動するタスクがある場合、または定期的なタスクをスケジュールしたい場合に便利です。

これを使用するには、 Executors.newScheduledThreadPool(1)を呼び出します。

パラメータについては後ほど説明します。ただし、今のところ知っておく必要があるのは、このメソッドが呼び出されるときにScheduledExecutorServiceオブジェクトが取得されるということです。

ScheduledExecutorServiceは、 ExecutorServiceを拡張するインターフェイスです。

このインターフェースには次のメソッドが表示されます。

方法 説明

ScheduledFuture<?>
schedule(Runnable command,
                                  long delay, TimeUnit unit);
指定された遅延後に実行される 1 回限りのアクションを作成して実行します。

<V> ScheduledFuture<V>
schedule(Callable<V> callable,
                                      long delay, TimeUnit unit);
を作成して実行します。予定将来指定された遅延後に実行されるオブジェクト。

ScheduledFuture<?>
scheduleAtFixedRate(Runnable command,
                                             long initialDelay,
                                             long period,
                                             TimeUnit unit);
最初に指定された初期遅延の後に実行され、次に指定された期間の後に再度実行される繰り返しアクションを作成して実行します。つまり、実行は、 initialDelayの後に開始され、次に、initialDelay + period、次に、initialDelay + 2 * periodというように続きます。

ScheduledFuture<?> scheduleWithFixedDelay(Runnable command,
                                                long initialDelay,
                                                long delay,
                                                TimeUnit unit);
最初に指定された初期遅延の後に実行され、次に 1 つの実行の完了と次の実行の開始の間に指定された遅延をおいて再度実行される、繰り返しアクションを作成して実行します。

そのため、インターフェイスを使用すると、タスクを一定の間隔で、または少し遅れて実行できます。

newScheduledThreadPool メソッドの詳細。

これはいくつかの方法で呼び出すことができます。


newScheduledThreadPool(int corePoolSize)
corePoolSize は、アイドル状態であってもプール内に保持するスレッドの数です。

newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory)

corePoolSize は、アイドル状態であってもプール内に保持するスレッドの数です。

threadFactoryは、新しいスレッドを作成するときに使用するファクトリです。

どちらの方法でも、指定した遅延後または定期的にアクションを実行するようにスケジュールできるスレッド プールが作成されます。

例を見て、ScheduledThreadPool がどのように機能するかを見てみましょう。

たとえば、電子メールを 5 秒ごとにチェックするタスクがあるとします。ただし、このチェックはメイン プログラムに影響を与えてはならず、追加のリソースが消費される可能性があります。

電子メールのチェックをシミュレートするタスク クラスがあります。


public class Task implements Runnable {
   @Override
   public void run() {
       System.out.println("Checking email...");
   }
}

次に、スレッド プールを作成し、チェックをスケジュールします。


ScheduledExecutorService executorService = Executors.newScheduledThreadPool(2);
executorService.scheduleAtFixedRate(new Task(), 0, 5, TimeUnit.SECONDS);

出力では、5 秒ごとに次のように表示されます。

メールをチェックしています...

一般に、この例のように、このようなプールを使用して定期的な「ハウスキーピング」タスクを実行できます。ハウスキーピング タスクは、メイン プログラムが何を行っているかに関係なく、実行する必要があるタスクです。