カテゴリ: Java 更新日: 2026/02/17

JavaのInterruptedExceptionを完全ガイド!初心者でも理解できるスレッド制御と例外処理

InterruptedExceptionクラス
InterruptedExceptionクラス

先生と生徒の会話形式で理解しよう

生徒

「Javaでスレッドを使っていたら、InterruptedExceptionというエラーが出たんですが、これは何ですか?」

先生

「InterruptedExceptionは、スレッドがsleepwaitjoinなどで待機中に割り込まれたときに発生するチェック例外です。スレッドプログラミングをすると必ず出会う重要な例外ですよ。」

生徒

「なるほど。普通にプログラムを書いているだけでは出ないんですね。どんなときに使われるんですか?」

先生

「マルチスレッドの処理で待機や同期を行うときによく使われます。具体例を交えて見ていきましょう。」

1. InterruptedExceptionとは?

1. InterruptedExceptionとは?
1. InterruptedExceptionとは?

JavaのInterruptedExceptionは、java.langパッケージに含まれるチェック例外で、スレッドが待機やスリープ中に割り込みが発生したときにスローされます。スレッドを安全に停止したり、他の処理を優先させたいときに活用される仕組みです。初心者にとっては聞き慣れないかもしれませんが、マルチスレッド処理を正しく扱うためには必須の知識です。

2. sleepメソッドとInterruptedException

2. sleepメソッドとInterruptedException
2. sleepメソッドとInterruptedException

Thread.sleep()メソッドは指定時間スレッドを休止させます。しかし、この間に別のスレッドから割り込みが入るとInterruptedExceptionが発生します。


public class SleepExample {
    public static void main(String[] args) {
        Thread thread = new Thread(() -> {
            try {
                System.out.println("スレッドを3秒休止します");
                Thread.sleep(3000);
                System.out.println("休止終了");
            } catch (InterruptedException e) {
                System.out.println("スレッドが割り込まれました");
            }
        });
        thread.start();
        thread.interrupt(); // 割り込みを送る
    }
}

スレッドを3秒休止します
スレッドが割り込まれました

このように、休止中のスレッドに割り込みを送ると待機が中断され、例外が発生します。

3. waitとnotifyでのInterruptedException

3. waitとnotifyでのInterruptedException
3. waitとnotifyでのInterruptedException

Object.wait()を使った同期処理でもInterruptedExceptionは発生します。スレッドが待機している間に割り込まれると、処理が強制的に終了します。


public class WaitExample {
    public static void main(String[] args) {
        Object lock = new Object();
        Thread t = new Thread(() -> {
            synchronized (lock) {
                try {
                    System.out.println("待機開始");
                    lock.wait();
                    System.out.println("待機解除");
                } catch (InterruptedException e) {
                    System.out.println("待機中に割り込まれました");
                }
            }
        });
        t.start();
        t.interrupt(); // 割り込み
    }
}

待機開始
待機中に割り込まれました

このように、待機メソッドを使った場合も割り込み処理を考慮する必要があります。

4. joinメソッドとInterruptedException

4. joinメソッドとInterruptedException
4. joinメソッドとInterruptedException

Thread.join()は、他のスレッドが終了するまで待機するメソッドです。この待機も途中で割り込まれるとInterruptedExceptionになります。


public class JoinExample {
    public static void main(String[] args) {
        Thread worker = new Thread(() -> {
            try {
                Thread.sleep(2000);
                System.out.println("ワーカースレッド終了");
            } catch (InterruptedException e) {
                System.out.println("ワーカーが中断されました");
            }
        });

        worker.start();

        try {
            worker.join(); // ワーカーが終わるまで待機
            System.out.println("メインスレッド続行");
        } catch (InterruptedException e) {
            System.out.println("待機中に割り込まれました");
        }
    }
}

このように、スレッド間の待機処理には必ず割り込みを考慮する必要があります。

5. InterruptedExceptionを回避・処理する方法

5. InterruptedExceptionを回避・処理する方法
5. InterruptedExceptionを回避・処理する方法

InterruptedExceptionは避けることができない性質の例外です。そのため、正しく処理する方法を理解することが大切です。よく使われるパターンとしては以下の通りです。

  • 例外をキャッチして処理を終了する
  • 例外をキャッチして割り込みフラグを再設定する
  • 安全にリソースを解放してから終了する

public class HandleExample {
    public static void main(String[] args) {
        Thread thread = new Thread(() -> {
            try {
                while (true) {
                    System.out.println("処理中...");
                    Thread.sleep(1000);
                }
            } catch (InterruptedException e) {
                System.out.println("安全に終了します");
                Thread.currentThread().interrupt(); // 割り込み状態を再設定
            }
        });
        thread.start();
        thread.interrupt();
    }
}

処理中...
安全に終了します

このように、処理を中断しつつリソースを解放できるようにするのが基本です。

6. 初心者が注意すべきポイント

6. 初心者が注意すべきポイント
6. 初心者が注意すべきポイント

初心者がマルチスレッドを学ぶとき、InterruptedExceptionを軽視してしまうことがよくあります。しかし、Javaのスレッド制御では非常に重要な例外であり、適切に処理しないとプログラムが不安定になったりリソースが解放されない問題につながります。

特に以下のポイントを覚えておきましょう。

  • sleepwaitjoinなどのメソッドでは必ず発生しうる
  • 割り込みは「例外」ではなく「他のスレッドからの合図」だと理解する
  • 処理の中断やリソース解放のタイミングを適切に設計する

こうした意識を持つことで、スレッドプログラミングを安全に進めることができます。

Javaの基礎を最初から体系的に学びたい人には、 初心者向けで定評のある定番入門書がこちらです。

スッキリわかるJava入門 第4版をAmazonで見る

※ Amazon広告リンク

カテゴリの一覧へ
新着記事
New1
Java
JavaのIOExceptionクラス徹底解説!初心者向けファイル入出力エラー対策ガイド
更新記事
New2
Java
JavaのInterruptedExceptionを完全ガイド!初心者でも理解できるスレッド制御と例外処理
新規投稿
New3
Thymeleaf
Thymeleafのth:hrefの使い方を全解説。初心者でも完璧に理解できるガイド
更新記事
New4
Spring
Springの@annotationアノテーションの使い方を完全ガイド!初心者でもわかるAOPの活用法
更新記事
人気記事
No.1
Java&Spring記事人気No1
Spring
Spring BootとJavaの互換性一覧!3.5/3.4/3.3はJava 21・17に対応してる?
No.2
Java&Spring記事人気No2
Spring
Springの@Componentアノテーションの使い方を徹底解説!初心者でもわかるSpring Boot入門
No.3
Java&Spring記事人気No3
Java
JavaのIOExceptionクラス徹底解説!初心者向けファイル入出力エラー対策ガイド
No.4
Java&Spring記事人気No4
Spring
Springの@Serviceアノテーションの使い方を徹底解説!初心者でもわかるSpring フレームワーク入門
No.5
Java&Spring記事人気No5
Servlet
JavaのHttpSessionを徹底解説!初心者でもわかるセッション管理の基本
No.6
Java&Spring記事人気No6
Spring
SpringのBindingResultを完全ガイド!初心者でもわかる入力チェックとエラー処理
No.7
Java&Spring記事人気No7
Java
Javaの@SuppressWarningsアノテーションの使い方を完全ガイド!初心者でもわかる警告の抑制方法
No.8
Java&Spring記事人気No8
JSP
JSPの基本タグ一覧と使い方まとめ!実務で使えるタグを紹介

💻 作業効率アップに

長時間のコーディングでも疲れにくい♪ 静音ワイヤレスマウス

Logicool Signature M750 を見る

※ Amazon広告リンク