0

wait()およびnotify()/notifyAll()メソッドが、他の言語で使用されている従来のループ/ポーリング構造を置き換える目的に役立つことを理解しています。

while(true) {
    if(pollSomethingForAnEvent())
        break;
}

Conditionこのモデルをより「OO」な実装でラップするために、Java 5 で API が導入されたことをさらに理解しています。

が理解していないのは、Java がどのスレッドに通知するか、Object.notify()またはCondition.signal()呼び出されるかをどのように認識するか、またはJava がどのスレッドに通知するか、Object.wait()または呼び出されるかをどのように認識するかということCondition.await()です。

これらのメソッドはパラメーターとして何も受け取らないため、JVM はこれらの通知をどのスレッドに渡すかをどのように知るのでしょうか?!?!

4

1 に答える 1

2

同期されたオブジェクトごとConditionに、JVMはそれらを待機しているオブジェクトのキューを維持します。また、Thread実行状態を維持および管理する実行キューおよびその他のデータ構造もあります。

Object.notify()呼び出されると、オブジェクトに関連付けられたキューを調べて、最初のオブジェクトを取得Threadし、実行キューに移動します。キューが空の場合、スレッドは通知されません。がnotifyAll()呼び出されると、そのオブジェクトを待機しているすべてのスレッドに信号が送信されます。

問題を複雑にすることはありませんが、知っておくべき重要なことの1つはThread、呼び出されたものlockObject.wait()が通知されると、待機状態から実行キューの最後に移動して、ロックオンへのアクセスを待機することですlockObject。すぐには実行を開始しません。

于 2012-04-28T15:52:49.367 に答える