2

notify()を使用せずに、同期されたコードでwait()を使用できるかどうかを知りたいと思いました。たとえば、次のようになります。

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

前もって感謝します

4

4 に答える 4

5

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

待機、歩留まり、睡眠の違いを知ってください。同期ブロックで待機を呼び出す必要があります。待機に入るとロックが解除され、通知が呼び出されるまでスレッドはその状態のままになります。Yieldはスレッドを準備完了プールに戻し、スケジューラーがスレッドをいつ再実行するかを決定できるようにします。スリープとは、スレッドが一定期間休止することを意味します(そして、そこから準備完了プールに移動します)。

同期しているのと同じオブジェクト(ここではB.monitor)でwaitを呼び出すようにしてください。

于 2012-04-19T18:38:58.727 に答える
0

いいえ!唯一のオプションはタイムアウトで待つことです、それは確かにあなたを助けません。

于 2012-04-19T18:40:22.847 に答える
0

/* wait */をへの呼び出しに変更しwait()、誰もnotify()またはを呼び出さない場合notifyAll()、このスレッドは決してウェイクアップしません...

于 2012-04-19T18:40:55.047 に答える
0

必要なバリアである場合は、他のすべてのスレッドに通知する必要があります。

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

よろしく、

ピエール=リュック

于 2012-05-04T00:06:07.083 に答える