スレッドの作成と管理

Javaにおけるマルチスレッドと並行処理の中心的な要素は「スレッド(Thread)」です。スレッドは、プログラムの中で独立して実行される処理単位であり、複数のスレッドを同時に実行することで、効率的な並行処理が可能になります。

以下に「スレッドの作成と管理」について、詳しく説明します。


1. スレッドの作成方法

Javaでスレッドを作成する方法は主に2つあります。

1-1. Thread クラスを継承する

java
class MyThread extends Thread { public void run() { System.out.println("スレッドが実行されています。"); } } public class Main { public static void main(String[] args) { MyThread thread = new MyThread(); thread.start(); // run()ではなくstart()を呼ぶ } }

ポイント

  • run() メソッドにスレッドで実行したい処理を記述します。

  • start() メソッドを呼び出すことで、新しいスレッドが作られ、非同期に run() が実行されます。

1-2. Runnable インターフェースを実装する

java
class MyRunnable implements Runnable { public void run() { System.out.println("Runnableスレッドが実行されています。"); } } public class Main { public static void main(String[] args) { Thread thread = new Thread(new MyRunnable()); thread.start(); } }

ポイント

  • Runnable を使うことで、継承制限を避けられます(Javaは多重継承をサポートしていないため)。

  • 実用的には、こちらの方法がより柔軟で推奨されます。


2. 匿名クラスやラムダ式の活用

匿名クラスを使う例

java
Thread thread = new Thread(new Runnable() { public void run() { System.out.println("匿名クラスのスレッドが実行されています。"); } }); thread.start();

ラムダ式を使う例(Java 8以降)

java
Thread thread = new Thread(() -> { System.out.println("ラムダ式のスレッドが実行されています。"); }); thread.start();

3. スレッドの管理

スレッドの実行状態や制御を管理するための代表的なメソッドや手法:

3-1. join() メソッド

スレッドの終了を待つために使用します。

java
Thread thread = new Thread(() -> { System.out.println("別スレッドの処理中..."); }); thread.start(); try { thread.join(); // この行でメインスレッドは thread の終了を待つ } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("メインスレッドの続き");

3-2. sleep() メソッド

スレッドを一時停止させる方法:

java
try { Thread.sleep(1000); // 1秒間スリープ } catch (InterruptedException e) { e.printStackTrace(); }

3-3. isAlive() メソッド

スレッドがまだ動作中かを確認:

java
if (thread.isAlive()) { System.out.println("スレッドはまだ実行中です。"); }

4. スレッドプールの利用(高レベルAPI)

Javaでは、Executors フレームワークを使って、スレッドの効率的な再利用が可能です。

java
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class Main { public static void main(String[] args) { ExecutorService executor = Executors.newFixedThreadPool(2); executor.submit(() -> System.out.println("スレッド1の処理")); executor.submit(() -> System.out.println("スレッド2の処理")); executor.shutdown(); // 終了の通知 } }

まとめ

方法 特徴
Threadクラスの継承 簡単だが拡張性に劣る
Runnableの実装 より柔軟、スレッド以外にも使用可能
ExecutorService スレッドプールを使った高効率な管理

生成日:2025/05/03