web-dev-qa-db-ja.com

スリープ状態のスレッドの中断または停止

Javaでスリープ状態のスレッドを停止または中断する方法。スレッドがスリープしているときにスレッドを停止して同期を停止したい場合、run()メソッドでデータを同期して10分間スリープするスレッドがあります。どうすればこれを達成できますか?

21
Suresh

スレッドでinterrupt()メソッドを呼び出します。これにより、スリープがキャンセルされ、InterruptedExceptionがスローされます。

19

Thread.interrupt()を使用して、スリープ状態のスレッドを中断できます。スレッドの停止は非推奨になりました-スレッドが何かにロックを保持している場合はどうなりますか? (Thread.stop()がありましたが、お勧めしません)。

あるいは、スリープする代わりに、タイムアウトでオブジェクトが通知されるのをスレッドに待機させ、スレッドをウェイクアップさせたい場合はオブジェクトに通知を簡略化できます。

11
EboMike

Suresh、私は一つの問題に注意を払いたいと思います。 interrupt()メソッド自体はスレッドを中断しません。フラグをtrueに設定することにより、割り込み要求をスレッドに送信するだけです。通常、スレッドはキャンセル/中断ポリシーを処理する必要があります。これは、Java実際の並行性、セクション7.1タスクのキャンセル)で大きく説明されています。

Thread.sleepやObject.waitなどのブロッキングライブラリメソッドは、スレッドが中断されたことを検出し、早期に戻ります。割り込みに応答して、割り込みステータスをクリアし、InterruptedExceptionをスローします。

6
Alexandr

Frederikは正しいです:Thread.interrupt();を呼び出します。私はあなたに警告したかった使用しない stop()Java 1.1。と他の警告から廃止されたので。そして、あなたがsleep()を使用しているならスレッドを中断したい場合は、wait()とnotify()への移動について考えるのがよいでしょう。Javaスレッドに関する多くのチュートリアルがあり、Java.lang.Threadのjavadocは十分に良いので、これらのAPIに慣れていない場合でも、読み続けることができます。

2
AlexR

コメントできないので別の回答を投稿します。私はアレクサンダーが言ったことを強化して明確にしたいだけです。 interrupt()Threadにフラグを設定するだけであり、拡張ThreadまたはRunnableオブジェクトはThread.interrupted()中断されたときに行うべきことを実行します。

interrupt()wait()またはsleep()を停止しますが、これらのメソッドは割り込みフラグの設定を解除することに注意してください。したがって、スリープ/待機中のスレッドでinterrupt()を呼び出すと、スリープ/待機は停止しますが、例外をキャッチした場合を除いて、スレッドが中断されたことを認識せず、中断され続けることはありません。

sleep()およびwait()メソッドで上書きできない独自の割り込みフラグを実装することで、私のプログラムを修正できました。また、Thread.currentThread().interrupt()を使用すると、スレッドを内部から中断できます。

1
GuiRitter