スレッド割り込み関連のメソッドinterrupt、interrupted、isInterruptedの違い

割り込み

このスレッドを中断します。このメソッドを呼び出すスレッドの状態は「割り込み」状態に設定され、スレッドは実行を停止しません。
Objectクラスのwait()、wait(long)、wait(long、int)メソッドまたはjoin()、join(long)、join(long、int)メソッドの呼び出し時にスレッドがブロックされている場合、sleep(long)またはsleep(long、int)などのメソッドの場合、中断されたステータスがクリアされ、InterruptedExceptionが受信されます。JUCロックまたはキュー関連クラスがInterruptedExceptionをスローする前に、次の静的メソッドinterruptedが呼び出されて、割り込み状態がクリアされます。そのため、この例外を再度スローするか、割り込みを再度呼び出す必要があります。そうしないと、スレッドの割り込みが発生します。ステータスが失われます。例:メインスレッドは子スレッドの割り込みステータスを監視してさまざまな処理を行います。子スレッドがこの例外をスローして正しく処理しない場合、メインスレッドは子スレッドの割り込みステータスを認識しません。 。
このスレッドがInterruptibleChannelのI / O操作中の場合ブロックされている場合、チャネルは閉じられ、スレッドの割り込みステータスが設定され、スレッドはjava.nio.channels.ClosedByInterruptExceptionを受け取ります。
このスレッドがjava.nio.channels.Selectorでブロックされている場合、このスレッドの割り込みステータスが設定され、のwakeupメソッドを呼び出すのと同じように、選択操作からすぐに戻ります(ゼロ以外の値を持つ場合があります)。セレクター。
上記の条件のいずれにも当てはまらない場合、スレッドの割り込みステータスが設定されます。
実行されていないスレッドを中断しても効果はありません 

中断

静的メソッド。現在のスレッドが中断されているかどうかをテストします。この方法により、スレッドの中断状態をクリアすることができます。つまり、このメソッドを2回続けて呼び出したい場合、2番目の呼び出しはfalseを返します(最初の呼び出しが中断されたステータスをクリアした後、2番目の呼び出しがそのステータスをチェックする前に現在のスレッドが再び中断されない限り)。
このメソッドはfalseを返すため、スレッドの中断を反映し、中断されたときにスレッドがアクティブでなかったため無視されます。

  public static boolean interrupted() {
        return currentThread().isInterrupted(true);
    }

isInterrupted

このスレッドが中断されているかどうかをテストします。スレッドの中断ステータスは、このメソッドの影響を受けません。
このメソッドはfalseを返すため、スレッドの中断を反映し、中断されたときにスレッドがアクティブでなかったため無視されます。

   public boolean isInterrupted() {
        return isInterrupted(false);
    }

isInterrupted(ブール値)

    private native boolean isInterrupted(boolean ClearInterrupted);

 割り込みとisInterruptedの両方が内部ローカルメソッドisInterruptedを呼び出していることがわかります。パラメータは、割り込みステータスがクリアされているかどうかです。

割り込みとisInterruptedの違い:interruptedは現在のスレッドに作用し、isInterruptedはこのメソッドを呼び出すスレッドオブジェクトに作用します。例:メインスレッドmainの子スレッドsubのisInterruptedメソッドを呼び出し、同時に静的割り込みメソッドを呼び出します。次に、isInterruptedは子スレッドサブに作用し、interruptedはメインスレッドメインに作用します

おすすめ

転載: blog.csdn.net/sinat_33472737/article/details/114681170