notify()を使用せずに、同期されたコードでwait()を使用できるかどうかを知りたいと思いました。たとえば、次のようになります。
wait_on(B):
synchronized(B.monitor) {
B.count--
while (B.count > 0) { /* wait */ }
}
前もって感謝します
notify()を使用せずに、同期されたコードでwait()を使用できるかどうかを知りたいと思いました。たとえば、次のようになります。
wait_on(B):
synchronized(B.monitor) {
B.count--
while (B.count > 0) { /* wait */ }
}
前もって感謝します
スレッドを待機状態から復帰させるには、notifyまたはnotifyAllが必要です。サンプルでは、コードは待機に入り、そこにとどまります(中断されない限り)。
待機、歩留まり、睡眠の違いを知ってください。同期ブロックで待機を呼び出す必要があります。待機に入るとロックが解除され、通知が呼び出されるまでスレッドはその状態のままになります。Yieldはスレッドを準備完了プールに戻し、スケジューラーがスレッドをいつ再実行するかを決定できるようにします。スリープとは、スレッドが一定期間休止することを意味します(そして、そこから準備完了プールに移動します)。
同期しているのと同じオブジェクト(ここではB.monitor)でwaitを呼び出すようにしてください。
いいえ!唯一のオプションはタイムアウトで待つことです、それは確かにあなたを助けません。
/* wait */
をへの呼び出しに変更しwait()
、誰もnotify()
またはを呼び出さない場合notifyAll()
、このスレッドは決してウェイクアップしません...
必要なバリアである場合は、他のすべてのスレッドに通知する必要があります。
wait_on(B) {
synchronized(B.monitor) {
B.count--
while (B.count > 0) {
B.monitor.wait()
}
B.monitor.notifyAll();
}
}
よろしく、
ピエール=リュック