ホームページ  >  記事  >  Java  >  スレッド割り込みとは何ですか? Java スレッド割り込みの詳細な紹介 (例付き)

スレッド割り込みとは何ですか? Java スレッド割り込みの詳細な紹介 (例付き)

不言
不言転載
2018-09-27 16:38:323065ブラウズ

この記事では、スレッド中断とは何ですか? Java スレッド中断の詳細については、参考にしていただければ幸いです。

スレッド スリープでは、スレッド割り込み例外をキャッチまたはスローする必要があります。つまり、眠っている間に誰かが突然突入してあなたを起こします。

try {
    Thread.sleep(3000);
} catch (InterruptedException e) {
    e.printStackTrace();
}

この時点でスレッドが中断された後、コードは実行を継続するか、実行を終了するために例外をスローします。これは、中断されたスレッドに必要な役割ではありません。

スレッド割り込みとは正確には何ですか?

スレッドの中断とは、スレッドが実行中に他のスレッドによって中断されることを意味します。これと stop の最大の違いは、stop ではスレッドがシステムによって強制的に終了されるのに対し、スレッドの中断ではスレッドがスレッドに割り込み信号を送信することです。ターゲット スレッドがスレッド割り込み信号を受信して​​スレッドを終了しない場合、スレッドは終了するか、他のロジックを実行するかはターゲット スレッドによって決定されます。

スレッドを中断する 3 つの最も重要なメソッドを見てみましょう。これらはすべて Thread クラスからのものです。

1, java.lang.Thread#interrupt

ターゲット スレッドに割り込み、ターゲット スレッドに割り込み信号を送信すると、スレッドは割り込み済みとしてマークされます。

2. java.lang.Thread#isInterrupted()

ターゲット スレッドが中断され、中断マークがクリアされないかどうかを決定します。

3.java.lang.Thread#interrupted

ターゲット スレッドが割り込まれたかどうかを判断するために、割り込みマークがクリアされます。

実践的なスレッド中断

スレッド中断の使用方法を例を挙げて説明しましょう。

例 1 (中断失敗)

/**
 * 微信公众号:Java技术栈
 */
private static void test1() {
    Thread thread = new Thread(() -> {
        while (true) {
            Thread.yield();
        }
    });
    thread.start();
    thread.interrupt();
}

例 1 のスレッドは中断されますか?回答: いいえ、割り込み信号がスレッドに送信されても​​、プログラムには割り込み信号に応答するロジックがないため、プログラムは何の反応も行いません。

例 2: (割り込み成功)

/**
 * 微信公众号:Java技术栈
 */
private static void test2() {
    Thread thread = new Thread(() -> {
        while (true) {
            Thread.yield();

            // 响应中断
            if (Thread.currentThread().isInterrupted()) {
                System.out.println("Java技术栈线程被中断,程序退出。");
                return;
            }
        }
    });
    thread.start();
    thread.interrupt();
}

例 2 では、割り込みに応答するロジックを追加しました。プログラムは、割り込み信号を受信して​​出力した後に戻り、終了します。情報を出します。

例 3 (中断失敗)

/**
 * 微信公众号:Java技术栈
 */
private static void test3() throws InterruptedException {
    Thread thread = new Thread(() -> {
        while (true) {
            // 响应中断
            if (Thread.currentThread().isInterrupted()) {
                System.out.println("Java技术栈线程被中断,程序退出。");
                return;
            }

            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                System.out.println("Java技术栈线程休眠被中断,程序退出。");
            }
        }
    });
    thread.start();
    Thread.sleep(2000);
    thread.interrupt();
}

例 3 sleep() メソッドが中断され、出力されましたJava テクノロジー スタック スレッドのスリープが中断され、プログラムが終了しました。 プログラムは実行を続けます...なぜですか?

sleep のソース コードを見てください:

スレッド割り込みとは何ですか? Java スレッド割り込みの詳細な紹介 (例付き)

sleep() メソッドが割り込みマークをクリアしていることがわかります。中断された後もループは実行を継続します。 。

例 4 (中断成功)

/**
 * 微信公众号:Java技术栈
 */
private static void test4() throws InterruptedException {
    Thread thread = new Thread(() -> {
        while (true) {
            // 响应中断
            if (Thread.currentThread().isInterrupted()) {
                System.out.println("Java技术栈线程被中断,程序退出。");
                return;
            }

            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                System.out.println("Java技术栈线程休眠被中断,程序退出。");
                Thread.currentThread().interrupt();
            }
        }
    });
    thread.start();
    Thread.sleep(2000);
    thread.interrupt();
}

例 4 は、すべての情報を出力して正常に終了します。sleep() メソッドが中断された後、現在の状態を手動で再中断するだけです。スレッドのマークがクリアされると、プログラムは割り込み信号を受信して​​終了に戻ります。

上記の 4 つの割り込みの例を通じて、Java スレッド割り込みの概念を包括的に理解できたと思います。

以上がスレッド割り込みとは何ですか? Java スレッド割り込みの詳細な紹介 (例付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。