私は、notify()を使わずに同期したコードに対してwait()を使うことができるかどうかを知りたかったので、同期コード(java)のときにnotify()を使わずにwait()を使う
wait_on(B):
synchronized(B.monitor) {
B.count--
while (B.count > 0) { /* wait */ }
}
ありがとうございます
私は、notify()を使わずに同期したコードに対してwait()を使うことができるかどうかを知りたかったので、同期コード(java)のときにnotify()を使わずにwait()を使う
wait_on(B):
synchronized(B.monitor) {
B.count--
while (B.count > 0) { /* wait */ }
}
ありがとうございます
スレッドを待ち状態から復帰させるには、notifyまたはnotifyAllが必要です。あなたのサンプルでは、コードは待機状態に入り、そこにとどまります(中断されない限り)。
待機時間、歩留まり、スリープの違いを把握してください。ロックが解除され、通知が呼び出されるまでスレッドはその状態を維持した後、同期ブロックで待機を呼び出す必要があります。 Yieldはスレッドをレディプールに戻し、スケジューラがいつ実行するかを決定させます。スリープとは、スレッドが一定期間休止状態になることを意味します(そこから準備プールに移動します)。
いいえ!時間切れで待つだけのオプションは、あなたには間違いありません。
あなたはwait()
への呼び出しに/* wait */
を変更し、誰もがnotify()
またはnotifyAll()
を呼び出しません場合は、このスレッドが目を覚ますことはありません...
それはあなたがしたいの障壁である場合は、あなたが必要となります
wait_on(B) {
synchronized(B.monitor) {
B.count--
while (B.count > 0) {
B.monitor.wait()
}
B.monitor.notifyAll();
}
}
よろしく、
ピエール・リュック
確かに、もし:あなたのnotifyAll他のスレッドへあなたはそれが通知のためのすべての永遠を待つことを望む。 –
'notify()'なしで 'wait()'状態から抜け出す方法は?あなたがやっていることは、スレッドを実際にやりなおすことなく殺すことに相当するものです。 – noMAD
同期されていなくても動作しますか? – MichBoy