Javaのスレッドプールとは?仕組みと実装例をわかりやすく解説
スレッドプールとは
スレッドプール(Thread Pool)とは、あらかじめ初期化された複数のスレッドをまとめて管理する仕組みのことです。基本的な考え方は、アプリケーションの起動時に一定数のスレッドを作成してプールに入れておき、それらのスレッドが仕事を待機するというものです。
サーバーがリクエストを受け取ると、利用可能なスレッドがあればプールから1つ取り出して処理を任せます。スレッドはタスクの完了後、破棄されることなくプールへ戻り、次の仕事を待ちます。もしプール内に空きスレッドが存在しない場合は、空きができるまでサーバー側で待機することになります。
スレッドプールのメリット
- タスクごとに新しいスレッドを生成する必要がないため、スレッド作成のコスト(時間・リソース)を節約できる
- ServletやJSPでは、コンテナがリクエスト処理のために内部でスレッドプールを利用している
このように、スレッドプールは大量のリクエストを効率的にさばくために欠かせない技術です。
サンプルコード
ここでは、ExecutorService と Executors を使ったシンプルなスレッドプールの実装例を紹介します。
EmployeeThread.java
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
class EmployeeThread implements Runnable {
private String message;
public EmployeeThread(String s) {
this.message = s;
}
public void run() {
System.out.println(Thread.currentThread().getName() + " (Start) message = " + message);
processmessage(); // スレッドを1秒間スリープさせるメソッドを呼び出し
System.out.println(Thread.currentThread().getName() + " (End)"); // スレッド名を出力
}
private void processmessage() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}このクラスは Runnable を実装しており、run() メソッド内でタスクの開始・終了を出力します。processmessage() では Thread.sleep(1000) によって1秒間の処理待ちをシミュレートしています。
ExampleThreadPool.java
public class ExampleThreadPool {
public static void main(String[] args) {
// 6つのスレッドを持つ固定サイズのプールを作成
ExecutorService executor = Executors.newFixedThreadPool(6);
for (int i = 0; i < 6; i++) {
Runnable worker = new EmployeeThread("" + i);
executor.execute(worker); // ExecutorServiceのexecuteメソッドでタスクを投入
}
executor.shutdown(); // 新規タスクの受付を停止
while (!executor.isTerminated()) { } // 全タスク完了まで待機
System.out.println("Finished all the threads");
}
}コードのポイント
- Executors.newFixedThreadPool(6):6つのスレッドを持つ固定サイズのスレッドプールを生成します。
- execute(worker):
ExecutorServiceのexecute()メソッドでタスクをプールに投入します。空きスレッドが順次タスクを引き受けます。 - shutdown():新規タスクの受け付けを停止します。すでに投入済みのタスクは最後まで実行されます。
- isTerminated():すべてのタスクが完了したかどうかを判定し、完了するまでループで待機します。
このプログラムを実行すると、6つのワーカースレッドが並行してタスクを処理し、それぞれの開始・終了がコンソールに出力されます。すべての処理が完了すると「Finished all the threads」が表示されます。
-
Javaのyield()メソッドとは?スレッド制御における重要性と使い方を解説
Javaのyield()メソッドは、Threadクラスに定義されたstaticメソッドです。このメソッドを呼び出すと、現在実行中のスレッドが一時的に実行を中断し、同じ優先度を持つ他の待機中スレッドに実行の機会を譲ることができます。ただし、待機中のスレッドが存在しない場合や、待機中のスレッドがすべて低優先度である場合は、呼び出したスレッド自身がそのまま実行を継続します。yield()メソッドの主な利点は、実行に時間のかかる現在のスレッドがプロセッサを一時的に手放すことで、他の待機中スレッドへCPUリソースを効率的に割り当てられる点にあります。構文(Syntax)public static voi
-
JavaのisDaemon()メソッドとは?デーモンスレッドの判定方法と重要性を解説
Javaにおけるデーモンスレッド(daemon thread)とは、低優先度のバックグラウンドスレッドのことです。主にJVMによって生成され、ガベージコレクション(GC)などの裏方の処理を担当します。デーモンスレッドの最大の特徴は、ユーザースレッドがすべて終了すると、デーモンスレッドの処理中であってもJVMが即座に終了するという点です。つまり、デーモンスレッドの唯一の目的はユーザースレッドを支援することにあり、単独ではプログラムの実行を維持できません。isDaemon()メソッドの役割isDaemon()メソッドを使用すると、あるスレッドがデーモンスレッドかどうかを判定できます。戻り値はboo