Javaの並行処理ScheduledThreadPoolExecutorの詳細解説
ScheduledThreadPoolExecutorは、ThreadPoolExecutorを継承したスレッドプールであり、指定された時間間隔でタスクを周期的に実行することができます。これは、Javaの並行処理パッケージで提供されているスケジュールされたタスクのためのスレッドプールです。
ScheduledThreadPoolExecutorの主要な特徴は次の通りです:
- 一定数のスレッドを作成してタスクを実行でき、これらのスレッドは再利用できるため、タスクを実行するたびにスレッドを作成および破棄するコストを避けることができます。
- 特定の時間間隔でタスクの実行をスケジュールすることができ、タスクの遅延実行時間や周期実行時間を設定することができます。
- タスクの優先順位を設定でき、高い優先順位のタスクが優先的に実行されます。
- タスクのタイムアウト時間を設定でき、タスクが設定されたタイムアウト時間を超過すると、タスクは中断されます。
- スレッドプールが新しいタスクを実行できない場合の拒否ポリシーを設定することができます。
ScheduledThreadPoolExecutorの利用手順は以下の通りです。
- ScheduledThreadPoolExecutorのインスタンスを作成するには、ScheduledThreadPoolExecutorのコンストラクタを使用するか、ファクトリーメソッドを使用することができます。
- RunnableまたはCallableインターフェースを実装するタスクを作成します。
- ScheduledThreadPoolExecutorのschedule()メソッドやscheduleAtFixedRate()メソッドを使用して、タスクを提出し、タスクの遅延実行時間と周期実行時間を設定してください。
- 予定されているタスクの実行をキャンセルする場合は、ScheduledFutureのcancel()メソッドを呼び出すことができます。
以下は、ScheduledThreadPoolExecutorを使用してタスクの実行をスケジュールする方法を示すサンプルコードです。
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class ScheduledThreadPoolExecutorExample {
public static void main(String[] args) {
// 创建一个ScheduledThreadPoolExecutor实例,最多同时执行2个任务
ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(2);
// 创建一个实现Runnable接口的任务
Runnable task = new Runnable() {
@Override
public void run() {
System.out.println("Task is running");
}
};
// 调用scheduleAtFixedRate()方法来提交任务,设定任务的延迟执行时间和周期执行时间
executor.scheduleAtFixedRate(task, 0, 1, TimeUnit.SECONDS);
// 运行一段时间后关闭线程池
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
executor.shutdown();
}
}
上記のコードでは、最大で2つのタスクを同時に実行するScheduledThreadPoolExecutorインスタンスが作成され、次にRunnableインターフェースを実装したタスクが作成され、最後にscheduleAtFixedRate()メソッドを呼び出してタスクを提出し、遅延実行時間を0、周期実行時間を1秒に設定しました。その後、5秒間実行した後にスレッドプールをシャットダウンします。
ScheduledThreadPoolExecutorを使用すると、タスクの実行を柔軟にスケジューリングすることができ、一定の時間間隔でタスクを定期的に実行することができます。定期的なタスクの実行が必要な場合に非常に適しています。