スレッドのBLOCKED状態とWAITING状態の違いは何ですか。
Javaコードコメント
/**
* Thread state for a thread blocked waiting for a monitor lock.
* A thread in the blocked state is waiting for a monitor lock
* to enter a synchronized block/method or
* reenter a synchronized block/method after calling
* {@link Object#wait() Object.wait}.
*/
BLOCKED,
/**
* Thread state for a waiting thread.
* A thread is in the waiting state due to calling one of the
* following methods:
* <ul>
* <li>{@link Object#wait() Object.wait} with no timeout</li>
* <li>{@link #join() Thread.join} with no timeout</li>
* <li>{@link LockSupport#park() LockSupport.park}</li>
* </ul>
*
* <p>A thread in the waiting state is waiting for another thread to
* perform a particular action.
*
* For example, a thread that has called <tt>Object.wait()</tt>
* on an object is waiting for another thread to call
* <tt>Object.notify()</tt> or <tt>Object.notifyAll()</tt> on
* that object. A thread that has called <tt>Thread.join()</tt>
* is waiting for a specified thread to terminate.
*/
WAITING,
ロックを待機するという点で、両方の状態が類似しているという意味ではありませんか?
あなたが投稿したコメントが答えを与えると思います。スレッドが別のスレッドを待っているという点で似ています。しかし、それらは同じではありません。
BLOCKED状態は、オブジェクトのモニターを待機することを意味します。これは、同期されたメソッドまたはステートメントが使用される場合によく発生します。スレッドは、同期されたコードへのアクセス、またはオブジェクトのモニターの所有を必要とするその他のアクションの実行を待機しています。この種のブロッキングは、スレッド間で試行および調整が行われていない場合によく発生しますが、オブジェクトの同期されたメソッドまたはステートメントを呼び出すスレッドが2つ以上あります。
待機とは、特定のアクションを待つことを意味します。 Notify、またはjoin()を使用してスレッドの終了を待機します。この種類の待機は、スレッド間の調整の試みを示しているようです。スレッドは、あるスレッドが別のスレッドに通知するか、別のスレッドが完了するのを待機します。
混乱を招く可能性のある要因の1つは、待機を開始するために、Object.wait()を呼び出すには、オブジェクトのモニターを所有する必要があることです。しかし、Object.wait()は通知されるまでモニターを解放します。したがって、スレッドはモニターを取得するときにBLOCKED状態からWAITING状態に移行し、次にObject.wait()を実行して待機を開始します。 Doc: Java 7 Object.wait() を参照してください。
Java 7ドキュメントはこの解釈を確認するようです...
スレッドの状態。スレッドは次のいずれかの状態になります。
NEWまだ開始されていないスレッドがこの状態です。
RUNNABLE Java仮想マシンで実行中のスレッドはこの状態です。
BLOCKEDモニターロックを待機してブロックされているスレッドはこの状態です。
WAITING別のスレッドが特定のアクションを実行するのを無期限に待機しているスレッドは、この状態です。
TIMED_WAITING別のスレッドが指定された待機時間までアクションを実行するのを待機しているスレッドは、この状態です。
TERMINATED終了したスレッドはこの状態です。
スレッドは、特定の時点で1つの状態のみになることができます。これらの状態は、オペレーティングシステムのスレッド状態を反映しない仮想マシンの状態です。