Java には、特定のアクションを実行するためのメソッドがいくつかあります。
メソッドは、呼び出されたときにのみ実行されるコードのグループです。 結果を返す場合と返さない場合があります。
sleep や wait などのメソッドは、マルチスレッドに使用されます。どちらも一時停止してスレッドを待機状態にしますが、機能には大きな違いがあります。
主要な取り組み
- 「睡眠」は心身ともに活動を停止した休息状態であり、「待機」は特定の事象が発生するまでその場にとどまる、または行動を遅らせることです。
- 「睡眠」は自然で必要な身体機能ですが、「待つ」は選択または回避できる自発的な行動です。
- 「睡眠」は夜間に関連付けられますが、「待機」は一日中いつでも発生する可能性があります。
スリープ vs 待機
sleep() メソッドと wait() メソッドの違いは、sleep() メソッドはプログラムで現在のスレッドの実行を特定の期間一時停止するために使用され、wait() メソッドはプログラムで一時停止するために使用されることです。または、特定のメソッドが呼び出されるまで現在のスレッドを一時停止します。
sleep メソッドの使用中、現在のスレッドはモニターの所有権を失いません。
Sleep は静的メソッドであり、クラス スレッドの一部です。 待機時間が経過すると、スレッドは元の実行可能な状態に戻ります。
これにより、待機中に CPU が完全に使用されるようになります。
一方、Java プログラムでは、wait() メソッドを使用して、そのオブジェクトに対して別のスレッドが呼び出されるまで現在のスレッドを待機させます。
スレッドはモニターの制御を取得すると実行を続行します。
これは sleep とは異なり静的メソッドではなく、オブジェクト クラスの一部です。
比較表
比較のパラメータ | スリープ | 待つ |
---|---|---|
CLASS | sleep メソッドはスレッドクラスの一部です | wait メソッドはオブジェクトクラスの一部です |
メソッドの種類 | スリープは静的メソッドです | Wait は静的メソッドではありません |
呼び出しテクニック | sleep メソッドは、同期されたコンテキストの外部から呼び出すことができます | 待機メソッドは、同期されたコンテキストからのみ呼び出すことができます |
ロック解除 | Sleep メソッドは、同期中に、指定されたタイムアウトの間、オブジェクトのロックを解放しません。 | 同期中に Wait メソッドがオブジェクトのロックを解除し、実行の機会を得る |
宣言 | パブリック静的 void sleep() | public final void 待機() |
睡眠とは?
スレッド sleep() は、現在のスレッドを一時停止し、指定された期間待機状態にする Java プログラムの静的メソッドです。
待機状態と待機時間が終了すると、スレッドの状態は実行可能な状態に変わります。 そして、CPU がさらに実行されるのを待ちます。
この方法の目的は、プログラムに数秒の遅延を生じさせ、同時に CPU を最大限に活用することです。
システムがビジーまたは過負荷の場合、待機時間または一時停止時間は長くなりますが、そうでない場合は、実際の時間と同じかそれ以下になります。
sleep メソッドの戻り値の型は、何も値を返さないため、void と言えます。
スリープ スレッドは、モニターを失ったり、既に取得したスレッドをロックしたりしません。
いずれにしても、スリープが妨げられると、スレッドは Interrupted_Exception をスローします。
スレッドがスリープする実際の期間は、オペレーティング システムの一部であるスケジューラとシステム タイマーによって異なります。
sleep メソッドの構文は – public static void sleep(long milliseconds) です。
public static void sleep (long ミリ秒、int ナノ秒)
ここで、ミリ秒とナノ秒はスレッドがスリープする時間です。
待機とは
Wait() は、スレッド間通信に使用されるメソッドです。
wait() スレッドが使用されるたびに、システム内でnotify() やnotifyAll() などのメソッドが呼び出されるまで、呼び出し元スレッドまたは現在のスレッドは一時停止され、中断されます。
notify() メソッドは指定されたスレッドをウェイクアップしますが、notifyAll() はすべてのスレッドに適用できます。
同期されると、wait メソッドはリソースへのロックを放棄します。
Wait メソッドの戻り値はないので、void を返すと言えます。
Wait メソッドの XNUMX つの例外は、Interrupted_Exception (現在のスレッドがスリープ中に中断された場合) と IllegalMonitorStateException (現在のスレッドがモニター上のオブジェクトの所有者ではない場合) です。
Wait メソッドは、オブジェクト クラスの一部です。 このメソッドは適用可能であり、同期ブロックを介して呼び出すことができます。
wait メソッドは、同期中に一時停止またはロックされた画面を解放します。
また、Wait メソッドは、同期された複数のスレッドが同じオブジェクトに XNUMX つずつアクセスすることを排他的に許可します。
Wait メソッドの構文は次のとおりです。 public final void wait()
スリープと待機の主な違い
- Sleep メソッドを使用すると、期限切れまたは中断されない限り、指定したタイムアウトの間、指定された特定の期間、スレッドがスリープ状態になります。一方、Wait メソッドは、notify() や NotifyAll() などのメソッドが呼び出されるまで、スレッドをスリープさせます。
- Sleep メソッドはスレッド上で実行され、Wait メソッドはオブジェクト上で実行されます。
- Sleep メソッドは時刻同期に使用され、Wait メソッドはマルチスレッド同期に使用されます。
- 待機スレッドでは、同期された複数のスレッドが同じオブジェクトに隣接してアクセスできますが、スリープ スレッドでは、同期された複数のスレッドは現在のスレッドのスリープが終了するまで待機する必要があります。
- Wait メソッドはロックまたはモニターを解放しますが、Sleep メソッドは現在のスレッドのスリープまたは待機中にモニターを解放しません。