「こんにちは、アミーゴ!」

「ここで、sleep、yield、join メソッドについて少し説明します。」

「それは退屈です。ちょうど面接での質問を見つけました。『 yield ()、sleep ()、wait () メソッドの違いは何ですか?』という質問です。説明できますか?」

「大丈夫です。まず、これら 3 つはまったく異なる方法です。」

1) sleep(timeout)  – timeout パラメータで指定されたミリ秒間、現在のスレッド (sleep が呼び出されたスレッド) を停止します。その後、スレッドは TIMED_WAITING 状態になります。isInterrupted フラグが設定されている場合、メソッドはより早く終了する可能性があります。

説明
Thread.sleep(500);
現在のスレッドは、自身の実行を 500 ミリ秒、つまり 0.5 秒間一時停止します。

2) yield()  – 現在のスレッドは「順番をスキップ」します。スレッドは実行状態から準備完了状態に移行し、JVM は次のスレッドに進みます。実行状態と準備完了状態は、 RUNNABLE状態のサブ状態です。

説明
Thread.yield();
現在のスレッドは「順番をスキップ」し、Java はすぐに次のスレッドに切り替えます。

3) wait(timeout) – これはwait () メソッド のバージョンですが、タイムアウトがあります。「waitメソッドは、現在のスレッドによってロックされているミューテックス オブジェクトの同期ブロック内でのみ呼び出すことができます。それ以外の場合、メソッドは Illegal MonitorState例外をスローします。

「このメソッドを呼び出すと、ミューテックス オブジェクトのロックが解放され、別のスレッドがロックを取得できるようになります。さらに、スレッドは WAITING 状態 (パラメータなしの wait() メソッドの場合) または TIMED_WAITING 状態 (wait(timeout の場合) に入ります) ) 方法)。"

説明
Object monitor = getMonitor();
synchronized(monitor)
{
 …
 monitor.wait(500);
 …
}
wait メソッドが呼び出されると、現在のスレッドはモニター オブジェクトのロックを解放し、500 ミリ秒間スリープします。監視オブジェクトは別のスレッドで取得できます。
500 ミリ秒後にスレッドが起動し、モニターがビジーでなければ、スレッドはモニターを取得して作業を続けます。
モニターが別のスレッドによってロックされている場合、現在のスレッドは BLOCKED 状態に切り替わります。

4) 参加(タイムアウト)

「このメソッドはあなたの質問にはありませんでしたが、私のレッスンプランにあるので、それについて説明します。 join() または join(timeout) メソッドを呼び出すと、現在のスレッドはスレッドに「アタッチ」されますこのメソッドが呼び出されました。現在のスレッドはスリープ状態になり、結合先のスレッド (つまり、join() メソッドが呼び出されたスレッド) が終了するまで待機します。

「現在のスレッドは、join() メソッドの場合は WAITING 状態になり、join(timeout) メソッドの場合は TIMED_WAITING 状態になります。」

説明
Thread thread = getWorkThread();
thread.join(500);
現在のスレッドは、workerThread スレッドに参加し、スレッドが終了するのを待ちます。
ただし、500 ミリ秒後に「参加解除」され、実行を継続します。

「wait(timeout) メソッドと join(timeout) メソッドのタイムアウトは、メソッドがスリープ状態になって何かを待機しますが、ミリ秒単位で指定されたタイムアウトを超えないことを意味します。その後、メソッドは起動します。」

「これらのメソッドに共通しているのはタイムアウトだけのようです。それらはまったく異なることを行います。」

「はい、そうです。」