あるThread.interrupt()
スレッドでが呼び出されると、そのスレッドはどうなりますか?
4 に答える
ターゲットスレッドは「中断」されています。ほとんどの場合、フラグはそのスレッドに設定され、スレッドはそれを(でThread.interrupted()
)見ることができます。ターゲットスレッドが現在何らかのI/OまたはObject.wait()
でブロックされている場合は、それぞれ、InterruptedIOException
またはでウェイクアップされInterruptedException
ます。
スレッドの中断は、スレッドを微調整するための穏やかな方法です。これは、アサルトライフルでスレッドを撃つようなものとは対照的に、スレッドをきれいに終了する機会を与えるために使用されます。Thread.stop()
そのメソッドのJavadocは、どのような状況で何が起こるかを説明しています。
これがJDK1.6Javadocです。
このスレッドを中断します。
現在のスレッドがそれ自体に割り込んでいない限り(常に許可されています)、このスレッドのcheckAccessメソッドが呼び出され、SecurityExceptionがスローされる可能性があります。
Objectクラスのwait()、wait(long)、wait(long、int)メソッド、またはjoin()、join(long)、join(long、int)の呼び出しでこのスレッドがブロックされた場合、sleep(long)、またはsleep(long、int)、このクラスのメソッドの場合、その割り込みステータスはクリアされ、InterruptedExceptionを受け取ります。
このスレッドが割り込み可能なチャネルでのI/O操作でブロックされた場合、チャネルは閉じられ、スレッドの割り込みステータスが設定され、スレッドはClosedByInterruptExceptionを受け取ります。
このスレッドがセレクターでブロックされている場合、スレッドの割り込みステータスが設定され、セレクターのウェイクアップメソッドが呼び出されたかのように、おそらくゼロ以外の値で、選択操作からすぐに戻ります。
上記の条件のいずれも当てはまらない場合、このスレッドの割り込みステータスが設定されます。
生きていないスレッドを中断しても、効果がある必要はありません。
ZeissSは正しいです、シグナリングはそれを行うための最もクリーンな方法です。割り込み例外をキャッチして、その方法でクリーンアップすることもできます。