1. ホーム
  2. java

[解決済み] wait()とsleep()の違いについて

2022-03-17 21:39:01

質問

とはどのような違いがあるのでしょうか? wait()sleep() をThreadsに入れるのですか?

私の理解では wait() -の場合、スレッドはまだ実行中で、CPUサイクルを使用しますが sleep() -ingはCPUサイクルを消費しないのですか?

なぜ ともに wait()sleep() その実装は、より低いレベルでどのように異なるのでしょうか?

どのように解決するのか?

A wait を呼び出す別のスレッドによって起こされる可能性があります。 notify を使用しているのに対し、待機しているモニター上で sleep はできません。また wait (そして notify ) はブロック内で行わなければなりません。 synchronized をモニタオブジェクト上で実行するのに対し sleep を使用しない。

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

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

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

(同じ mon オブジェクトを実行すると、最初のスレッド (モニターで待機している唯一のスレッドと仮定) がウェイクアップします。

を呼び出すこともできます。 notifyAll 複数のスレッドがモニタ上で待機している場合、これは すべて起動 . しかし、そのうちの1つのスレッドだけがモニターをつかむことができます(この場合、「1つのスレッドに1つしかない」ことを思い出してください。 waitsynchronized ブロック)に移動し、続行します。他の人は、モニターのロックを取得できるまでブロックされます。

もう一つのポイントは wait について Object を呼び出すのに対して、それ自体(つまり、オブジェクトのモニタで待機する)を呼び出します。 sleep について Thread .

さらにもう一点は スプリアスウェイクアップ から wait (すなわち、待機中のスレッドが明白な理由なく再開される)。次のようにします。 常に wait ある条件下で回転させながら を次のようにします。

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