33

SO コンセンサスと、インターネット上のほぼすべての Java スレッド状態図との間には矛盾があるようです。具体的には、起動後または起動 のスレッド状態遷移について...WAITINGnotify()notifyAll()

したがって、SO に関するコンセンサスは次WAITINGBLOCKEDとおりnotify()ですnotifyAll()。下の図は、この遷移を緑色で示しています。

質問

Web 上のほとんどの状態図が からWAITINGへの遷移を示しておりRUNNABLE、 ではないのはBLOCKEDなぜですか? 赤色の描写は、正しくない遷移を示しています。私は何かを逃していますか?

ここに画像の説明を入力

4

4 に答える 4

23

notifyスレッドを WAITING から RUNNABLE にする呼び出しを示す図はすべて間違っています (または不明なショートカットを使用しています)。スレッドがnotify(または偽のウェイクアップからでも) ウェイクアップされると、スレッドが待機していたオブジェクトのモニターを再ロックする必要があります。これがBLOCKED状態です。

モニター・ロックを待ってブロックされたスレッドのスレッド状態。ブロック状態のスレッドは、監視ロックが同期ブロック/メソッドに入るのを待っているか、 を呼び出した後に同期ブロック/メソッドに再び入るのを待っていますObject.wait

これは、次の javadoc で説明されていObject#notify()ます。

目覚めたスレッドは、現在のスレッドがこのオブジェクトのロックを放棄するまで先に進むことができません。

Object#wait()

スレッドは、モニターの所有権を再度取得できるまで待機し、実行を再開します。

于 2015-02-07T04:55:09.133 に答える