待機していないオブジェクトで notifyAll メソッドを呼び出すとどうなりますか? 例外が必要ですか、それとも通常の状況ですか?
6 に答える
ここでわかるように、待機していないオブジェクトで notifyAll() を呼び出しても効果はありません。
それは完全に正常です。1 つのモニターで待機中のすべてを通知することしかできません。他の誰もが興味を持っていません。notifyAll を呼び出すオブジェクトは、他のユーザーが待機しているモニターにすぎません。誰も待っていなければ、誰にも通知する必要はありません
完全に正常な状態。
キューに要素を入れるプロデューサー スレッドと要素を削除するコンシューマー スレッドがあるとします。
コンシューマーがキューを空にして、まだ処理に専念している可能性があるため、キューが空でなくなるのを誰も待っていません。ここで、プロデューサーは新しい要素をキューに追加します。コンシューマが待機中の場合は、notifyAll() を呼び出してコンシューマを起動する必要があります。誰かが待っているかどうかをチェックする追加のロジックを追加し、その場合にのみ notifyAll() を呼び出すと、シナリオがかなり (そして非常に失敗しやすい) 複雑になります。毎回 notifyAll() を呼び出す方がはるかに簡単です。
オブジェクトは「待機中」であり、それ自体を待機していません。スレッドは待っている人です。誰も待っていなければ、誰も目を覚まさず、特別なことは何も起こりません。
待機中のオブジェクトのみが通知されます。Object.wait() は、タイムアウトまたは通知までブロックします。つまり、待機していないオブジェクトが通知される方法または理由について疑問が残ります。意味がない。