Java の InterruptedException - スレッド割り込み例外の解決策
Java マルチスレッド プログラミングでは、スレッド割り込み例外は一般的な問題であり、注意が必要な問題です。スレッドが実行中に、別のスレッドがそのスレッドに割り込みたい場合、InterruptedException がスローされます。この記事では、InterruptedException の原因と解決策について説明します。
InterruptedException は、スレッドの中断によりスローされる例外です。スレッドの実行中に、別のスレッドがinterrupt() メソッドを通じてスレッドに割り込むことができます。中断されたスレッドが IO 操作の待機やロックの待機などの待機状態にある場合、InterruptedException がスローされます。
たとえば、次のコードでは、スレッド t1 がスリープするために Thread.sleep() を実行しているときに、スレッド t2 がそれを中断するため、t1 は InterruptedException 例外をスローします。
Thread t1 = new Thread(() -> { try { Thread.sleep(5000); } catch (InterruptedException e) { System.out.println("Thread interrupted"); } }); t1.start(); Thread t2 = new Thread(() -> { t1.interrupt(); }); t2.start();
スレッドが InterruptedException をスローした場合、特定の状況に応じて処理する必要があります。通常は、catch ブロックで Thread.currentThread().interrupt() を呼び出してスレッドを再中断し、上位の呼び出し元がスレッドが中断されたことを認識できるようにする必要があります。
たとえば、次のコードでは、スレッド t1 の実行が終了した後、スレッドが中断されたかどうかを確認し、catch ブロックで再度中断します。
Thread t1 = new Thread(() -> { try { Thread.sleep(5000); System.out.println("Thread finished"); } catch (InterruptedException e) { Thread.currentThread().interrupt(); System.out.println("Thread interrupted"); } }); t1.start(); Thread t2 = new Thread(() -> { t1.interrupt(); }); t2.start();
さらに、ロックの解放やファイルのクローズなど、リソースのクリーンアップが必要な操作をスレッドが実行している場合は、catch ブロックでもクリーンアップ操作を実行する必要があります。たとえば、次のコードでは、スレッド t1 が実行を完了した後、リソースを解放し、中断されたかどうかを確認します。
Thread t1 = new Thread(() -> { Lock lock = new ReentrantLock(); lock.lock(); try { Thread.sleep(5000); System.out.println("Thread finished"); } catch (InterruptedException e) { Thread.currentThread().interrupt(); System.out.println("Thread interrupted"); } finally { lock.unlock(); } }); t1.start(); Thread t2 = new Thread(() -> { t1.interrupt(); }); t2.start();
つまり、InterruptedException 例外処理メソッドの定義は非常に重要であり、スレッド割り込み操作を正しく処理し、コードの複雑さを可能な限り軽減するのに役立ちます。
以上がJava の InterruptedException - スレッド割り込み例外の解決策の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。