スリープと待機の違い(表付き)

Javaには、特定のアクションを実行するためのいくつかの方法があります。メソッドはコードのグループであり、呼び出されたときにのみ実行されます。結果を返す場合と返さない場合があります。

マルチスレッドには、sleepやwaitなどのメソッドが使用されます。どちらも一時停止してスレッドを待機状態にしますが、機能に大きな違いがあります。

スリープvs待機

sleep()メソッドとwait()メソッドの違いは、プログラムでsleep()メソッドを使用して現在のスレッドの実行を特定の期間一時停止するのに対し、wait()メソッドをプログラムで使用して一時停止または一時停止することです。特定のメソッドが呼び出されるまでの現在のスレッド。

sleepメソッドの使用中、現在のスレッドはモニターの所有権を失うことはありません。スリープは静的メソッドであり、クラススレッドの一部です。待機時間が経過すると、スレッドは元の実行可能状態に戻ります。待機中、CPUの完全な使用を保証します。

一方、Javaプログラムではwait()メソッドを使用して、そのオブジェクトに対して別のスレッドが呼び出されなくなるまで、現在のスレッドを待機するように命令します。スレッドは、モニターの制御を取得すると、実行を続行します。これはsleepとは異なり静的メソッドではなく、オブジェクトクラスの一部です。

スリープと待機の比較表

比較のパラメータ睡眠 待って
クラスsleepメソッドはスレッドクラスの一部です waitメソッドはオブジェクトクラスの一部です
メソッドのタイプ睡眠は静的な方法です待機は静的な方法ではありません
呼び出しテクニックsleepメソッドは、同期されたコンテキストの外部から呼び出すことができますwaitメソッドは、同期されたコンテキストからのみ呼び出すことができます
ロック解除Sleepメソッドは、同期中に、指定されたタイムアウトの間、オブジェクトのロックを解放しませんWaitメソッドは、同期中に実行する機会を得るために、オブジェクトのロックを解放します
宣言public static void sleep() public final void wait()

睡眠とは何ですか?

スレッドsleep()は、Javaプログラムの静的メソッドであり、現在のスレッドを一時停止し、指定された期間待機状態にします。待機状態と時間が経過すると、スレッド条件は実行可能状態に変更されます。そして、CPUがさらに実行されるのを待ちます。

この方法の目的は、プログラムに数秒間の遅延を作成し、同時にCPUを最大限に活用することです。システムがビジーまたは過負荷の場合、待機時間または一時停止時間は長くなり、そうでない場合は実際の時間以下になります。

スリープメソッドのreturnタイプは、値を返さないため、voidと言えます。スリープスレッドは、モニターを失ったり、既に取得したスレッドをロックしたりすることはありません。いずれにせよスリープが妨げられると、スレッドはInterrupted_Exceptionをスローします。スレッドがスリープする実際の期間は、通常、オペレーティングシステムの一部であるスケジューラーとシステムタイマーによって異なります。

sleepメソッドの構文は次のとおりです– public static void sleep(long mmols)

public static void sleep(longミリ秒、intナノ秒)

ここで、ミリ秒とナノ秒はスレッドがスリープする時間です。

待機とは何ですか?

Wait()は、スレッド間通信に使用されるメソッドです。 wait()スレッドが使用されるときはいつでも、notify()やnotifyAll()などのメソッドがシステムで呼び出されるまで、呼び出し元または現在のスレッドが一時停止および一時停止されます。

notify()メソッドは指定されたスレッドをウェイクアップしますが、notifyAll()はすべてのスレッドに適用できます。同期されると、waitメソッドはリソースへのロックを放棄します。 Waitメソッドの戻り値がないため、voidを返していると言えます。

Waitメソッドの2つの例外は、Interrupted_Exception(現在のスレッドがスリープ中に中断された場合)とIllegalMonitorStateException(現在のスレッドがモニター上のオブジェクトの所有者でない場合)です。

Waitメソッドはオブジェクトクラスの一部です。このメソッドは適用可能であり、同期されたブロックを介して呼び出すことができます。 waitメソッドは、同期中に一時停止またはロックされた画面を解放します。また、Waitメソッドは、同期された複数のスレッドが同じオブジェクトに1つずつアクセスすることを排他的に許可します。

Waitメソッドの構文は次のとおりです– public final void wait()

スリープと待機の主な違い

  1. Sleepメソッドは、期限切れまたは中断されない限り、通常は指定されたタイムアウトの間、指定された特定の期間スレッドをスリープさせます。一方、Waitメソッドは、notify()やnotifyAll()などのメソッドが呼び出されるまでスレッドをスリープさせます。
  2. Sleepメソッドはスレッドで実行され、Waitメソッドはオブジェクトで実行されます。
  3. Sleepメソッドは時間同期に使用され、Waitメソッドはマルチスレッド同期に使用されます。
  4. 待機スレッド中、同期された複数のスレッドは、スリープスレッド内で同じオブジェクトに隣接してアクセスできます。同期された複数のスレッドは、現在のスレッドのスリープが終了するまで待機する必要があります。
  5. Waitメソッドはロックまたはモニターを解放しますが、Sleepメソッドは現在のスレッドのスリープまたは待機中にモニターを解放しません。

結論

SleepメソッドとWaitメソッドは、Javaのネイティブメソッドです。そして、両方とも、現在進行中のスレッドを実行不可能な状態にするために広く使用されています。どちらの方法も、プログラムのマルチスレッド化に使用されます。

スリープ方式は、通常ナノ秒からミリ秒まで続く特定の期間、画面をロックする排他的なオプションを提供します。ただし、waitメソッドは、別のメソッドが呼び出されるまで画面をロックまたは一時停止するため、sleepメソッドの使用時のように期間が特定されたままになることはありません。

これらは、クラス、メソッド、同期、ロックの保持と解放の期間、その他のいくつかのパラメーターなど、特定の機能の点で互いに異なります。多くの場合、プログラマーは、どのメソッドがスレッドのスリープに理想的であるかについて混乱します。メソッドの使用法は、現在のスレッドの必要性、緊急性、期間などの要件によって異なります。

参考文献

  1. https://pdfs.semanticscholar.org/51fd/24ae444910fd39b117bb3044a12591f038fa.pdf
  2. https://dl.acm.org/doi/pdf/10.1145/289524.289572
x
2D vs 3D