各スレッドには、割り込み状態を保持する特別なフラグがあり、isInterrupted()
メソッドでアクセスできます。誰かがスレッドを中断すると、このフラグはtrue
に設定されます。それで全部です。このスレッドによって実行されるコードがこのフラグをチェックしてInterruptedException
をスローするか、可能であればスレッドの実行を終了するまで、実際の割り込みは発生しません。
現在のスレッドをブロックするように設計された標準ライブラリの多くのメソッドは、実際にはこのフラグを時々チェックし、フラグが設定されているとInterruptedException
をスローします。例えば、Thread.sleep()
,Thread.join()
,Object.wait()
,Lock.lockInterruptibly()
など多くのものがある。したがって、あなたのスレッドが定期的にこのフラグを明示的にチェックしたり暗黙的にチェックする記述されたメソッドのいくつかによってブロックされたりすると、そのスレッドは中断します。そうでなければ、そうではありません。
したがって、ループが空のスレッドは、中断状態をチェックしないため中断できません。しかし、中断状態のチェックを追加すると、それを修正します:
は
try {
while (true) {
Thread.sleep(timeout);
}
} catch(InterruptedException e) {
// Do nothing, just let the thread exit
}
は、任意の数の理由があるかもしれませんが、彼らはすべてのカテゴリ」の下に下落するだろう:中断に応答メソッドを呼び出す
はも働くだろうあなたのキャンセル要求にもかかわらずタスクは停止しません "。あなたの真のループは、それらの多くの理由の一つでしょう。 –
@アーウィン、それらのためのルール\パターンはありますか? – Jason
どのタイプのタスクをキャンセルすることができますか、どのパターン? – Jason