Java における「wait()」と「sleep()」の違い 質問する

Java における「wait()」と「sleep()」の違い 質問する

wait()スレッドのとの違いは何ですかsleep()?

wait()-ing スレッドはまだ実行モードであり、CPU サイクルを使用しますが、 -ingsleep()は CPU サイクルを消費しないという私の理解は正しいでしょうか?

なぜと の両方 があるのでしょうか?wait()sleep()

より低いレベルでの実装はどのように異なりますか?

ベストアンサー1

wait別のスレッドの呼び出しによって「起動」される可能性があるnotify待機中のモニターでは、sleepできません。また、wait(および)はモニター オブジェクトのnotifyブロック内で発生する必要がありますが、は発生しません。synchronizedsleep

Object mon = ...;
synchronized (mon) {
    mon.wait();
} 

この時点で、現在実行中のスレッドは待機し、モニターを解放します。別のスレッドが

synchronized (mon) { mon.notify(); }

(同じmonオブジェクト上で) 最初のスレッド (それがモニター上で待機している唯一のスレッドであると仮定) が起動します。

電話もできますnotifyAll複数のスレッドがモニターを待機している場合、これによりそれらすべてが起動されます。ただし、スレッドのうち 1 つだけがモニターを取得して続行できます ( はブロックwait内にあることに注意してくださいsynchronized)。他のスレッドは、モニターのロックを取得できるまでブロックされます。

もう一つのポイントはwaitObjectそれ自体(つまり、オブジェクトのモニターを待機する)を呼び出すのに対しsleepThread

さらにもう 1 つのポイントは、誤ったウェイクアップ(つまり、待機中のスレッドが明確な理由もなく再開する)が発生する可能性があることです。スピン中は常に、次のような条件で実行するwait必要がありますwait

synchronized {
    while (!condition) { mon.wait(); }
}

おすすめ記事