Javaスレッド割り込み例外(InterruptedException)の解決方法

WBOY
リリース: 2023-08-26 23:51:34
オリジナル
1034 人が閲覧しました

Javaスレッド割り込み例外(InterruptedException)の解決方法

Java スレッド割り込み例外 (InterruptedException) の解決方法

Java のスレッド割り込み例外 (InterruptedException) は、スレッドが待機 (スリープ) し、取得を待機しているときに発生します。ロック (待機などの操作中に他のスレッドによってスローされた例外) とセマフォ (シグナル) の待機。この例外の発生は、現在のスレッドが通常の実行フローから中断されたことを意味します。実際の開発では、プログラムの安定性と信頼性を確保するために、この例外を合理的に処理する必要があります。

Java スレッド割り込み例外を解決する主な方法は次のとおりです。

  1. 割り込みステータスを復元する
    スレッドでスレッド割り込み例外が発生すると、例外がスローされてクリアされます。割り込みステータス (割り込みフラグビットをゼロにクリア)。例外を処理する前に、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() メソッドを使用して割り込みステータスをリセットします。

  1. 上位層に例外をスローし続ける
    割り込み例外が発生したときに、割り込み状態を復元したくないが、上位層に例外をスローし続けたい場合があります。この場合、例外を処理のために上位層に直接スローできます。

以下はサンプル コードです:

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)上位層に例外をスローし続けます。

  1. 正常に終了
    場合によっては、スレッドが中断された後に正常に終了したいことがあります。実装に関しては、フラグ ビットを追加して、割り込みが発生したかどうかを判断し、適切なタイミングでスレッドを終了できます。

以下はサンプル コードです:

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート