割り込みメソッド
Interrupt は文字通り割り込みを意味しますが、Java では Thread.interrupt() メソッドが実際には何らかの方法でスレッドに通知するものであり、スレッドを直接終了するわけではありません。何をすべきかはコードを書いた人が決定し、通常はスレッドを中止します。
スレッドが Object クラスの wait()、wait(long)、または wait(long, int) メソッド、または join()、join(long)、join(long, int)、sleep(long)、またはクラス (long、int) のスリープはメソッド中にブロックされ、その割り込みステータスはクリアされ、また InterruptedException を受け取ります。
割り込み可能なチャネル (java.nio.channels.InterruptibleChannel) 上の I/O 操作でスレッドがブロックされた場合、チャネルは閉じられ、スレッドの割り込みステータスが設定され、スレッドは ClosedByInterruptException を受け取ります。
スレッドがセレクター (java.nio.channels.Selector) でブロックされている場合、スレッドの割り込みステータスが設定され、選択操作が呼び出されたかのように、選択操作からすぐに戻ります (おそらくゼロ以外の値が返されます)。装置の方式は同じです。
以前の条件がいずれも保存されていない場合、スレッドの割り込みステータスが設定されます。
非アクティブなスレッドを中断しても効果はありません。
割り込みを検出する
割り込みがどのように検出されるかは、スレッドが実行している内容によって異なります。
スレッドが InterruptException をスローできるメソッドを呼び出した場合は、InterruptException をキャッチして catch ブロックで処理します (通常は run メソッドを終了してスレッドを中断します)。
他のメソッドを呼び出す場合は、アイドル時に Thread.interrupted をチェックして割り込み信号を受信したかどうかを判断し、割り込み信号を受信したことを確認してから処理することができます。以前の処理方法と一貫性を保つために、InterruptException をスローできます。
割り込みステータス
スレッドの割り込みメカニズムは、割り込みステータスの内部フラグを使用して実装されます。割り込みステータスは、スレッドのinterrupt()メソッドが呼び出されたときに設定されます(上記の割り込みメソッドの説明を参照)。
スレッドの割り込みステータスを取得するには、次の 2 つの方法があります。
静的メソッド Thread.interrupted() を呼び出します。このメソッドは、現在のスレッドの割り込みステータスを返すだけでなく、現在のスレッドの割り込みステータスもクリアします。つまり、このメソッドが連続して 2 回呼び出された場合、2 番目の呼び出しは false を返します (最初の呼び出しで割り込みステータスがクリアされた後、2 番目の呼び出しで割り込みステータスが確認される前に、現在のスレッドは再び割り込まれます。例外) )。
指定したスレッドの isInterrupted() メソッドを呼び出します。このメソッドは、スレッドの割り込みステータスに影響を与えることなく、指定したスレッドの割り込みステータスのみを返します。
スレッドの割り込みステータスをクリアするには、次の 2 つの方法があります。
上で述べたように、Thread.interrupted() を呼び出すと、
スレッドのinterrupt()メソッドが呼び出されてInterruptedExceptionが発生したとき、オブジェクトのwait()、wait(long)、またはwait(long, int)メソッドを含むスレッドの割り込みステータスが同時にクリアされています。クラス、またはスレッドの join() 、 join(long) 、 join(long, int) 、 sleep(long) 、または sleep(long, int) メソッド