ホームページ >Java >&#&チュートリアル >sleep() と wait() の違いは何ですか?
この記事では、sleep() と wait() の違いについて説明します。 、特定の参考値があり、困っている友人がそれを参照できます。お役に立てば幸いです。
sleep() と wait() の違いは何ですか。
sleep は、スレッド クラス (Thread) のメソッドです。これにより、このスレッドは指定された時間実行を一時停止し、他のスレッドに実行の機会を与えますが、監視ステータスは維持され、監視ステータスが維持されると自動的に再開されます。時が来る。 sleep を呼び出してもオブジェクトのロックは解除されません。 wait は、Object クラスのメソッドです。このオブジェクトに対して wait メソッドを呼び出すと、このオブジェクトに対して Notice メソッドまたは NotifyAll が発行された後でのみ、このスレッドはオブジェクト ロックを放棄し、待機中のロック プールに入ります。スレッドはオブジェクト ロック プールに入り、オブジェクト ロックを取得する準備をします。オブジェクト ロックは実行状態になります。
スレッドがオブジェクトの同期メソッドに入るとき、他のスレッドがこのオブジェクトの他のメソッドに入ることができるかどうか。
他のスレッドは、オブジェクトの他の非同期メソッドにのみアクセスできますが、同期メソッドはアクセスできません。
スレッド同期方法とは何ですか?
wait(): スレッドを待機状態にし、スレッドが保持しているオブジェクトのロックを解放します。
sleep(): 実行中のスレッドを静的なスリープ状態にします。メソッド。InterruptedException 例外をキャッチするためにこのメソッドを呼び出します。
notify(): このメソッドを呼び出す場合、JVM ではなく待機状態のスレッドを正確に起こすことはできないことに注意してください。優先順位ではなく、どのスレッドを起動するかを決定します。
notifyAll(): 待機状態にあるすべてのスレッドを起動します。これは、起動されたすべてのスレッドにオブジェクト ロックを与えることではなく、それらのスレッドを競合させるためです。 。
マルチスレッドの実装方法と同期の実装方法はいくつかあります。
マルチスレッドには、Thread クラスの継承と Runnable インターフェイスの実装という 2 つの実装方法があります。
同期には、synchronized、wait、notify という 2 つの実装方法があります。
同期と非同期の類似点と相違点は何ですか?また、それらはどのような状況で使用されますか?
データがスレッド間で共有される場合。たとえば、書き込まれているデータが将来別のスレッドによって読み取られる可能性がある場合、または読み取られたデータが別のデータによって書き込まれた場合、これらのデータは共有データであり、同期的にアクセスする必要があります。アプリケーションが実行に時間がかかるメソッドを呼び出し、プログラムがメソッドの戻りを待たないようにする場合は、非同期プログラミングを使用する必要があります。多くの場合、非同期アプローチの方が効率的です。
run() または start() を使用してスレッドを開始します。
スレッドの開始とは、start() メソッドを呼び出して、スレッドによって表される仮想マシンを実行可能な状態にすることです。これは、JVM によってスケジュールおよび実行できることを意味します。スレッドはすぐに実行されます。 run() メソッドは、終了必須フラグを生成することでスレッドを停止できます。
スレッドの基本概念、スレッドの基本ステータス、および状態間の関係。
スレッドは、実行プロセス中にプログラム コードを実行できる実行単位を指します。各プログラムには、プログラム自体であるスレッドが 1 つ以上あります。Java には 4 種類のスレッドがあります。ステータスは、実行中、準備完了、一時停止、および終了です。
synchronized と java.util.concurrent.locks.Lock の類似点と相違点を簡単に説明します。
主な類似点: Lock は、synchronized によって実装されたすべての関数を完了できます。
主な違い: Lock は、synchronized よりも正確なスレッド セマンティクスと優れたパフォーマンスを備えています。 synchronized は自動的にロックを解放しますが、Lock ではプログラマが手動でロックを解放する必要があり、finally 句で解放する必要があります。
Java でスレッドを実装するために使用できるメソッドはいくつありますか?同期方法を変更するにはどのようなキーワードが使用されますか? stop() とsuspend() が非推奨になったのはなぜですか?
Thread の継承と Runnable インターフェイスの実装の 2 つの実装方法があります。
同期メソッドを stop() を使用するように変更するには、synchronized を使用します。安全ではない。これにより、スレッドによって取得されたすべてのロックが解放され、オブジェクトが一貫性のない状態にある場合、他のスレッドがその状態でオブジェクトを検査および変更できます。その結果、実際の問題を検出することが困難になります。
suspend() メソッドはデッドロックになりやすいです。 suspend() が呼び出されると、ターゲット スレッドは停止しますが、以前に取得したロックはまだ保持されています。この時点で、「一時停止」されたスレッドが動作を再開しない限り、他のスレッドはロックされたリソースにアクセスできません。どのスレッドでも、ターゲット スレッドを再開し、同時にロックされているリソースを使用しようとすると、デッドロックが発生します。したがって、suspend() を使用するのではなく、スレッドをアクティブにするか一時停止するかを示すフラグを Thread クラスに置く必要があります。フラグがスレッドを一時停止する必要があることを示している場合は、wait() を使用してスレッドが待機状態に入るように命令します。フラグがスレッドを再開する必要があることを示している場合は、notify() を使用してスレッドを再開します。
上記は、sleep() と wait() の違いの完全な紹介です。
Java ビデオ チュートリアル
について詳しく知りたい場合は、注目してください。 PHP中国語ウェブサイトへ。
以上がsleep() と wait() の違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。