誰もがThread.stop()を呼び出さない理由について素晴らしい情報を与えてくれました。
セルゲイのコメントは、私がinterrupt()処理について与えた誤った情報を修正しました。私はlewapの答えのようにシグナルフラグを使うのが好きです。 Sergeyの言っているように、interrupt()はブロックされた操作のスレッドを起動させるためのものです。スレッドがブロッキング操作を呼び出さない場合、interrupt()はスレッドを実際に終了しません。あなたのスレッドは割り込みが呼び出されたかどうかを見るためにisInterrupted()を呼び出すことができます(シグナルフラグ、基本的に)。
あなたの本の例に戻って、私はそれが好きではありません。
if (myThread != null) {
Thread dummy = myThread;
myThread = null;
dummy.interrupt();
}
この例では、ダミー変数にコピーする理由はありません。あなたは混乱するのが正しいです。
本書の著者は、他のスレッドが同時に同じスレッドを中断しようとは考えていないかもしれませんが、その割り込みコードはスレッドセーフではありません(「nullの場合にチェックしてヌルに設定」操作はアトミックではありません)。ダミーの割り当てを書くことは、実際のスレッドの安全性を追加することなく水を混乱させることです。
スレッドの中断は必ずしも例外を生成しません。固定された一連のブロッキング操作のみが行われるため、どこにでも例外がスローされる可能性はありません。ブーリアンフラグと割り込みは、実際には何かを積極的に行っているスレッドに信号を送るためのものです。もう1つは、どこかでブロックされたスレッドを起動させることです(起動後ブールフラグをチェックできます)。また、InterruptedExceptionはチェックされた例外ですので、誤って処理することを忘れることはかなりありません。 –
ああ、私の間違い。ありがとう、私は私の記事を修正しました。 – Astral
投稿されたコード**は正しくありません**! 「スレッドダミー= myThread; if(dummy!= null){this.myThread = null; dummy.interrupt();} 'これまでのところ、最も古典的なデータ競合条件の中で最もクラスの高いものがあります。 – bestsss