2012-04-19 4 views
1

私は、notify()を使わずに同期したコードに対してwait()を使うことができるかどうかを知りたかったので、同期コード(java)のときにnotify()を使わずにwait()を使う

wait_on(B): 
    synchronized(B.monitor) { 
    B.count-- 
     while (B.count > 0) { /* wait */ } 
    } 

ありがとうございます

+9

確かに、もし:あなたのnotifyAll他のスレッドへあなたはそれが通知のためのすべての永遠を待つことを望む。 –

+0

'notify()'なしで 'wait()'状態から抜け出す方法は?あなたがやっていることは、スレッドを実際にやりなおすことなく殺すことに相当するものです。 – noMAD

+0

同期されていなくても動作しますか? – MichBoy

答えて

4

スレッドを待ち状態から復帰させるには、notifyまたはnotifyAllが必要です。あなたのサンプルでは、​​コードは待機状態に入り、そこにとどまります(中断されない限り)。

待機時間、歩留まり、スリープの違いを把握してください。ロックが解除され、通知が呼び出されるまでスレッドはその状態を維持した後、同期ブロックで待機を呼び出す必要があります。 Yieldはスレッドをレディプールに戻し、スケジューラがいつ実行するかを決定させます。スリープとは、スレッドが一定期間休止状態になることを意味します(そこから準備プールに移動します)。

+1

+1この答えに勝つために;) – Bitmap

+0

しかし、これはすべてのスレッドがこのメソッドに入るまで起こり、最後のものはカウントを0にするでしょう、そして、それは出るでしょう、それは自動的にnotify() 、または私は間違っていますか? – MichBoy

+0

@MichBoy:「自動」通知はありません。カウンタが0になると、それ以上のスレッドはwhileループの本体に入ることはありません。それはすべて起こります。 –

0

いいえ!時間切れで待つだけのオプションは、あなたには間違いありません。

0

あなたはwait()への呼び出しに/* wait */を変更し、誰もがnotify()またはnotifyAll()を呼び出しません場合は、このスレッドが目を覚ますことはありません...

0

それはあなたがしたいの障壁である場合は、あなたが必要となります

wait_on(B) { 
    synchronized(B.monitor) { 
     B.count-- 
     while (B.count > 0) { 
      B.monitor.wait() 
     } 
     B.monitor.notifyAll(); 
    } 
} 

よろしく、

ピエール・リュック

関連する問題