Skip to content
閲覧中:
1. スレッドの基本とRunnable/Callable (1-15)

1. スレッドの基本とRunnable/Callable (1-15)

承知いたしました。Java Gold試験において「並列処理の基本」として出題される全15項目を、省略せずに詳細に解説します。


1-4. スレッドの作成とインターフェース

1. Threadクラスの継承

Threadを継承し、run()をオーバーライドします。ただし、Javaでは単一継承の制限があるため、実務ではあまり推奨されません。

Java
class MyThread extends Thread {
    public void run() { System.out.println("Running in Thread class"); }
}
new MyThread().start();

2. Thread.start() と Thread.run() の違い(重要)

試験で最も多いひっかけです。

  • start(): 新しいスレッドを起動し、そのスレッドでrun()を呼び出す。
  • run(): 現在実行中のスレッド(メインなど)で単なるメソッドとして実行される。

3. Runnableインターフェース

戻り値がなく、チェック例外(Exception)を投げることができません

Java
Runnable r = () -> System.out.println("Running via Runnable");
new Thread(r).start();

4. Callableインターフェース

Java 5で導入されました。**戻り値(V)を返すことができ、チェック例外を外に投げる(throws Exception)ことが可能**です。

Java
Callable<Integer> c = () -> {
    Thread.sleep(100); // throwsできる
    return 42; 
};

5-11. スレッドの制御メソッド

5. Thread.sleep()

指定したミリ秒間、スレッドを休止させます。InterruptedException(チェック例外)の処理が必須です。

Java
Thread.sleep(1000); // 1秒停止

6. Thread.join()

対象スレッドが終了するまで、呼び出し側のスレッド(例:メインスレッド)を待機させます。

Java
Thread t = new Thread(r);
t.start();
t.join(); // tが終わるまでここで止まる

7. Thread.interrupt()

待機中(sleepやjoin)のスレッドに対して「割り込み」をかけ、InterruptedExceptionを発生させます。

8. isInterrupted() と interrupted()

  • t.isInterrupted(): 割り込みフラグの状態を返す。フラグは変化しない。
  • Thread.interrupted(): 現在のスレッドのフラグを返し、**フラグをfalseにリセット**する。

9. デーモンスレッド

メインスレッドが終了した際、処理が途中でも強制終了されるスレッドです。

Java
Thread t = new Thread(r);
t.setDaemon(true); // start()の前に設定する必要がある

10. スレッドの優先度(setPriority)

Thread.MIN_PRIORITY (1) から MAX_PRIORITY (10) までありますが、実行順序を保証するものではありません。

11. Thread.yield()

他のスレッドにCPUの実行権を譲る「ヒント」をOSに送ります。必ず譲るわけではありません。


12. スレッドの状態 (Thread.State)

スレッドはライフサイクルの中で以下のいずれかの状態になります。

  1. NEW: スレッドが生成され、まだstart()されていない。
  2. RUNNABLE: start()後。実行中、またはCPUの割り当て待ち。
  3. BLOCKED: synchronizedなどのロック解除を待っている。
  4. WAITING: join()wait()により、期限なしで待機中。
  5. TIMED_WAITING: sleep(ms)join(ms)など、期限付きで待機中。
  6. TERMINATED: run()メソッドが終了した。

13-15. 同期化とメモリの整合性

13. synchronized (インスタンスロック)

特定のインスタンスに対して、一度に一つのスレッドしかメソッドに入れないようにします。

Java
public synchronized void increment() { count++; }

14. static synchronized (クラスロック)

インスタンスが異なっても、その「クラス」全体で同時に一つのスレッドしか実行できないようにします。

15. volatileキーワード

変数の値を各スレッドのキャッシュに保持させず、常にメインメモリから直接読み書きさせます。

  • 可視性: あるスレッドが値を書き換えたことが、他のスレッドから即座に見える。
  • 原子性の欠如: count++ のような複数ステップの処理はスレッドセーフになりません(その場合はAtomicInteger等が必要)。

💡 試験合格のための暗記リスト

  1. Runnable = 戻り値なし / Callable = 戻り値あり
  2. start() = 新スレッド / run() = 現在のスレッド
  3. interrupted() = フラグを**クリアする**(staticメソッド)
  4. synchronized = 排他制御(一度に一人)
  5. volatile = 最新値の共有(キャッシュ禁止)

次は、試験でもより複雑な問題として出る 「16-30. Executor Service フレームワーク」 に進みますか?それともこの部分を深掘りしますか?