Goetzの著書JCIPによると:
各スレッドには独自の割り込みポリシーがあるため、そのスレッドにとっての割り込みの意味がわからない限り、スレッドに割り込みをかけないでください。
では、なぜJava言語がpublic interrupt ()
メソッドを提供したのですか?これは設計上の欠陥ですか?では、誰または何がスレッドを中断することになっていますか?
Goetzの著書JCIPによると:
各スレッドには独自の割り込みポリシーがあるため、そのスレッドにとっての割り込みの意味がわからない限り、スレッドに割り込みをかけないでください。
では、なぜJava言語がpublic interrupt ()
メソッドを提供したのですか?これは設計上の欠陥ですか?では、誰または何がスレッドを中断することになっていますか?
彼が意味するのは、スレッドが何をし、どのように機能するかがわからない場合は、スレッドを中断してはならないということです。interrupt()
すべてのスレッドが中断される可能性があるため、クラスにメソッドを含めることは論理的Thread
です。
間違った場所で実行されたときに「害」を及ぼす可能性のある他の多くのメソッドについても、同じことを求めることができます。メソッドはツールであり、プログラマーは正しく機能するプログラムを作成するためにこれらのツールを賢く使用する必要があります。
まず、Javaの並行性の実践を読むことをお勧めします。
この質問はあなたが言ったことに答えることができると思います。
ちなみに、スレッドを防ぐ方法を見てみましょう。Threadクラスの3つのメソッドのいずれかを使用して、スレッドの実行を防ぐことができます。
yield()
join()
sleep()
yield()
メソッドは、現在実行中のスレッドを一時的に一時停止して、同じ優先度の残りの待機中のスレッドに実行の機会を与えます。待機中のスレッドがない場合、またはすべての待機中のスレッドの優先度が低い場合、同じスレッドが実行を続行します。実行の機会を得るときに生成されるスレッドは、動作がベンダーに依存するスレッドスケジューラによって決定されます。
join()
実行中のスレッドt1がjoin()
t2を呼び出す場合。t2.join()
すぐにt1は、t2が実行を完了するまで待機状態になります。
sleep()
要件に基づいて、スレッドを指定された期間スリープ状態にすることができます。
まあ、それは決して欠陥ではありません。(ただし、Thread.stop()
実際のような他の方法は)
より良いのはThread.interrupt()
、スレッドがブロック/待機/スリープしている場合にのみスレッドに影響を与えることです。実行中の場合はinterrupt()
、ステータス変数を設定することによってスレッドに停止を要求するだけです。ステータス変数は、Thread.interrupted()
またはによって照会できます。Thread.isInterrupted()
run()
通常、スレッドを外部で停止するのではなく、スレッドをメソッドから戻すのが最善の方法です。
void run() {
while(!isInterrupted())
//executed
}
Thread.interrupted()
ただし、割り込みステータスがクリアされるので注意してください。