私はスレッドに関するOracle Javaチュートリアルを行っていましたが、この例を見ました
ソース: http://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html
InterruptedException をスローするメソッドを呼び出さずにスレッドが長時間実行された場合はどうなりますか? 次に、定期的に Thread.interrupted を呼び出す必要があります。これは、割り込みが受信された場合に true を返します。例えば:
for (int i = 0; i < inputs.length; i++) {
heavyCrunch(inputs[i]);
if (Thread.interrupted()) {
// We've been interrupted: no more crunching.
return;
}
チュートリアルは次のように追加します: 割り込みメカニズムは、割り込みステータスとして知られる内部フラグを使用して実装されます。Thread.interrupt を呼び出すと、このフラグが設定されます。スレッドが静的メソッド Thread.interrupted を呼び出して割り込みをチェックすると、割り込みステータスがクリアされます。あるスレッドが別のスレッドの割り込みステータスを照会するために使用する非静的 isInterrupted メソッドは、割り込みステータス フラグを変更しません。
慣例により、InterruptedException をスローして終了するメソッドは、その時点で割り込みステータスをクリアします。ただし、割り込みを呼び出す別のスレッドによって、割り込みステータスがすぐに再度設定される可能性は常にあります。
今、私は混乱しています。それはいつ起こりますか?割り込みがある場合、スレッドは InterruptedException を受け取るべきではありませんか?
誰かがコードをチェックインするためにこれらの方法を使用するのはいつですか? Thread.interrupt (フラグ) は静的であるため、上記のチェックでは、踏み板のいずれかが中断されているかどうかを実際にチェックします。その場合でも、チュートリアルによると、スレッドが静的メソッド Thread.interrupted を呼び出して割り込みをチェックすると、割り込みステータスがクリアされます。 または、InterruptedException をスローして終了するメソッドは、そのときに割り込みステータスをクリアします。
それで、私は何かが欠けていますか?または、これは、一部のスレッドが割り込みを受信したが、それをチェックしないか、スローしない場合にのみ役立ちますか?