Javaマルチスレッド-Thread.interrupt()は何を意味しますか?


著者:Intopass
リンク:https://www.zhihu.com/question/41048032/answer/89431513
ソース:知っていますか
著作権は作者の所有に帰する。商業転載は作者に連絡して授権を獲得してください。商業転載ではないので、出典を明記してください。
まず、スレッドは他のスレッドによって強制的に中断または停止されるべきではなく、スレッド自身で停止されるべきである。だから、Thread.stop、Thread.suspend、Thread.reumeはもう廃棄されました。Thread.interruptの役割は、スレッドを中断するのではなく、「スレッドを中断するべきだ」ということです。具体的に中断するか、それとも継続するかは、通知されたスレッドが自分で処理するべきです。
具体的には、スレッドに対してinterrupt()を呼び出した場合、①スレッドがブロックされた状態(例えば、sleep、wait、joinなど)にあると、スレッドは即時にブロックされた状態を終了し、InterrupteExceptionをスローします。これだけです②スレッドが正常に活動している場合、このスレッドの中断フラグはtrueに設定されます。これだけです。中断フラグが設定されているスレッドは正常に動作し続け、影響を受けません。interrupt()は本当にスレッドを中断することができません。呼び出しられたスレッドは自分で協力しなければなりません。
つまり、スレッドが中断される需要があれば、このようにしてもいいです。
①通常動作タスクの場合は、本スレッドの中断フラグビットを常にチェックし、中断フラグが設定されている場合は、スレッドを停止します。
②遮断方法を呼び出した場合は、InterruptedException異常を正しく処理します。(例えば、catchが異常になったらスレッドを終了します。)
Thread thread = new Thread(() -> {
    while (!Thread.interrupted()) {
        // do more work.
    }
});
thread.start();

//       
thread.interrupt();
具体的には、あなたの問題について、Thread.interrupted()フラグビットをクリアするのは、次のテストを継続するためです。
スレッドが中断フラグに設定されている場合、終了スレッドを選択すると次の問題は自然に発生しません。
一方、スレッドが中断マークされている場合は、いくつかの処理が行われた後、タスクを続行するように選択します。
また、このタスクも中断される必要がありますので、当然マークをクリアする必要があります。