2012-05-19 4 views
9

Thread.sleep()は、現在実行中のスレッドを指定された時間だけ一時停止し、その後実行を待って実行可能状態に戻ります。Javaの同期コンテキストからThread.sleep()を呼び出す

また、​​コンテキストから呼び出された場合、sleep()は保持するロックを解放しません。だから私はいつロックを解除するのだろうかと思っていた。スレッドがスリープ状態になると、実行する機会が決して得られないので、ロック自体は常にロックされ、他のスレッドはどのように同期メソッド/ブロックに入るのかが決まります。

私は有効な質問をしているかどうかわかりません。しかし、私を助けてください。

答えて

16

私はロックが解除されるのが不思議でした。

​​ブロックの終了時にロックが解除されます。

スレッドがスリープ状態になると、実行する機会はありません。そのため、スレッドは常にロックを維持し、他のスレッドが同期化されたメソッド/ブロックに入る方法を保持します。

簡単に言えば、他のスレッドは、スリープ中のスレッド同じオブジェクトにを同期のコードを入力することができません。

要約すると、​​ブロックからThread.sleep()を呼び出すことはお勧めできません。

+2

本当に、 'Thread.sleep()'を呼び出すのは良い考えではないでしょう。あなたが今できることがあれば、今すぐやるべきことです。あなたができることができる前に何かを待たなければならない場合は、寝るよりも何かを待つべきです。 –

+2

@DavidSchwartz:私は同意します。 'Thread.sleep()'は正当な用途がありますが、それはしばしば使われるべきではありません。 – NPE

+0

よく説明されていますが、要約すると、同期化されたブロックからThread.sleep()を呼び出すことは良い考えではない可能性があります。あまりにも遠すぎます。時々あなたはロックを保ち続けたいと思っています。 – Jesus

13

Thread.sleepの代わりにObject.waitを使用すると、同期ブロックからのロックが解除されます。

関連する問題