wait()
スレッドのとの違いは何ですかsleep()
?
wait()
-ing スレッドはまだ実行モードであり、CPU サイクルを使用しますが、 -ingsleep()
は CPU サイクルを消費しないという私の理解は正しいでしょうか?
なぜと の両方 があるのでしょうか?wait()
sleep()
より低いレベルでの実装はどのように異なりますか?
ベストアンサー1
あwait
別のスレッドの呼び出しによって「起動」される可能性があるnotify
待機中のモニターでは、sleep
できません。また、wait
(および)はモニター オブジェクトのnotify
ブロック内で発生する必要がありますが、は発生しません。synchronized
sleep
Object mon = ...;
synchronized (mon) {
mon.wait();
}
この時点で、現在実行中のスレッドは待機し、モニターを解放します。別のスレッドが
synchronized (mon) { mon.notify(); }
(同じmon
オブジェクト上で) 最初のスレッド (それがモニター上で待機している唯一のスレッドであると仮定) が起動します。
電話もできますnotifyAll
複数のスレッドがモニターを待機している場合、これによりそれらすべてが起動されます。ただし、スレッドのうち 1 つだけがモニターを取得して続行できます ( はブロックwait
内にあることに注意してくださいsynchronized
)。他のスレッドは、モニターのロックを取得できるまでブロックされます。
もう一つのポイントはwait
、Object
それ自体(つまり、オブジェクトのモニターを待機する)を呼び出すのに対しsleep
、Thread
。
さらにもう 1 つのポイントは、誤ったウェイクアップ(つまり、待機中のスレッドが明確な理由もなく再開する)が発生する可能性があることです。スピン中は常に、次のような条件で実行するwait
必要があります。wait
synchronized {
while (!condition) { mon.wait(); }
}