Java スレッド割り込み例外 (InterruptedException) の解決方法
Java のスレッド割り込み例外 (InterruptedException) は、スレッドが待機 (スリープ) し、取得を待機しているときに発生します。ロック (待機などの操作中に他のスレッドによってスローされた例外) とセマフォ (シグナル) の待機。この例外の発生は、現在のスレッドが通常の実行フローから中断されたことを意味します。実際の開発では、プログラムの安定性と信頼性を確保するために、この例外を合理的に処理する必要があります。
Java スレッド割り込み例外を解決する主な方法は次のとおりです。
Thread.currentThread().isInterrupted()
メソッドを使用して割り込みが発生したかどうかを確認し、例外を無視するか、特定の状況に基づいてさらなる処理を実行するかを決定できます。 。割り込みステータスを維持し続ける必要がある場合は、Thread.currentThread().interrupt()
メソッドを呼び出して、例外処理の前に割り込みステータスをリセットできます。 次は簡単なコード例です:
Thread thread = new Thread(() -> { try { // 线程执行一些耗时操作 for (int i = 0; i < 10; i++) { System.out.println("执行中断操作 " + i); Thread.sleep(1000); } } catch (InterruptedException e) { // 捕获中断异常 System.out.println("线程被中断了"); // 恢复中断状态 Thread.currentThread().interrupt(); } }); thread.start(); // 主线程休眠2秒后中断子线程 Thread.sleep(2000); thread.interrupt();
上記のコードでは、子スレッドがループを実行し、各ループで時間のかかる操作 (1 秒スリープ) が実行されます。 。メインスレッドは 2 秒間スリープし、その後子スレッドを中断します。子スレッドが割り込み例外をキャッチすると、interrupt()
メソッドを使用して割り込みステータスをリセットします。
以下はサンプル コードです:
Thread thread = new Thread(() -> { try { // 线程执行一些耗时操作 for (int i = 0; i < 10; i++) { System.out.println("执行中断操作 " + i); Thread.sleep(1000); } } catch (InterruptedException e) { // 直接向上层抛出异常 throw new RuntimeException("线程中断异常", e); } }); thread.start(); // 主线程休眠2秒后中断子线程 Thread.sleep(2000); thread.interrupt();
上記のコードでは、子スレッドが割り込み例外をキャッチしたときに、 throw new RuntimeException("スレッド割り込み例外" , e)
上位層に例外をスローし続けます。
以下はサンプル コードです:
class MyThread extends Thread { private volatile boolean isInterrupted = false; public void setInterrupted(boolean interrupted) { isInterrupted = interrupted; } @Override public void run() { try { // 线程执行一些耗时操作 for (int i = 0; i < 10; i++) { if (isInterrupted) { System.out.println("线程被中断了"); return; } System.out.println("执行中断操作 " + i); Thread.sleep(1000); } } catch (InterruptedException e) { System.out.println("线程被中断了"); return; } } } MyThread thread = new MyThread(); thread.start(); // 主线程休眠2秒后中断子线程 Thread.sleep(2000); thread.setInterrupted(true);
上記のコードでは、スレッド クラス MyThread
をカスタマイズし、isInterrupted
を追加しました。フラグ。子スレッドの実行中に、フラグ ビットを判定してスレッドを終了するかどうかを決定します。
要約すると、Java スレッドの割り込み例外を解決するには、割り込みステータスを復元するか、上位層に例外をスローし続けるか、正常に終了することができます。具体的な選択は、特定のビジネス ニーズとシナリオに基づいて決定する必要があります。スレッド割り込み例外を適切に処理することは、プログラムの安定性と信頼性を確保する上で重要な部分であり、実際の状況に基づいて適切に設計する必要があります。
以上がJavaスレッド割り込み例外(InterruptedException)の解決方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。