Java でオブジェクト メソッド wait と notification を正しく使用する方法

PHPz
リリース: 2023-12-20 13:30:51
オリジナル
825 人が閲覧しました

Java でオブジェクト メソッド wait と notification を正しく使用する方法

Java でオブジェクト メソッドを正しく使用する方法: wait と Notice

Java では、wait と Notice は、複数のスレッド間のコラボレーションを実現するために使用される重要なメソッドです。これら 2 つの方法を正しく使用すると、競合状態やデッドロックなどのマルチスレッドの問題を回避し、プログラムの安全性と効率性を確保できます。この記事では、Java でオブジェクト メソッドの wait および notification を正しく使用する方法を紹介し、具体的なコード例を示します。

1. wait と Notice の基本原理と機能

wait と Notify の正しい使用方法を理解する前に、その基本原理と機能を理解する必要があります。

  1. wait: 現在のスレッドを、他のスレッドがnotifyまたはnotifyAllメソッドを通じてウェイクアップするまで待機状態にします。 wait メソッドを使用すると、オブジェクトのロックが効果的に解放され、現在のスレッドがブロックされ、実行が一時停止される可能性があります。
  2. notify: オブジェクトを待機しているスレッドを起動します。複数のスレッドが待機している場合、notify は 1 つのスレッドのみをランダムにウェイクアップし、ウェイクアップする特定のスレッドは不確かです。
  3. notifyAll: このオブジェクトを待機しているすべてのスレッドを起動します。待機中のすべてのスレッドをウェイクアップするには、notifyAll メソッドを使用します。ただし、どのスレッドをウェイクアップするかは、スレッド スケジューラによって異なります。

2. 待機と通知を正しく使用する手順

待機と通知を正しく使用するには、次の手順に従う必要があります。

  1. ロック: wait を使用する前に Notice と通信するときは、まずオブジェクトのロックを取得する必要があります。 synchronized キーワードを使用してロックすることも、Lock オブジェクトを使用してロックすることもできます。
  2. wait メソッドを呼び出す: クリティカル セクションに入る前に、ロック オブジェクトの wait メソッドを呼び出して、現在のスレッドを待機状態にします。
  3. 条件判断: クリティカルセクションに入る前に、まず共有リソースの状態をチェックする必要があります。条件が満たされていない場合は、条件が満たされるまで待機し続ける必要があります。
  4. ロックの解放: wait メソッドを呼び出した後、現在のスレッドはオブジェクトのロックを解放し、他のスレッドがクリティカル セクションに入って共有リソースを操作できるようにします。
  5. notify または NoticeAll メソッドを呼び出す: 条件が満たされた場合、ロック オブジェクトの Notify または NotifyAll メソッドを呼び出して、待機中のスレッドを起動できます。
  6. 再ロック: 目覚めたスレッドはオブジェクトのロックを取り戻し、実行を巡って競合し続けます。

3. 具体的なコード例

次のコード例は、wait と Notice を正しく使用して 2 つのスレッド間のコラボレーションを実現する方法を示しています。 1 つのスレッドはウェイクアップを待機する責任を負い、もう 1 つのスレッドはウェイクアップする責任を負います。

public class WaitNotifyExample {
    private static final Object lock = new Object();
    private static boolean isReady = false;

    public static void main(String[] args) {
        Thread waitingThread = new Thread(() -> {
            synchronized (lock) {
                while (!isReady) {
                    try {
                        System.out.println("等待中...");
                        lock.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println("等待结束!");
            }
        });

        Thread notifyingThread = new Thread(() -> {
            synchronized (lock) {
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("唤醒等待的线程...");
                isReady = true;
                lock.notify();
            }
        });

        waitingThread.start();
        notifyingThread.start();
    }
}
ログイン後にコピー

上記のコードを実行すると、待機中のスレッドが待機状態になり、目覚めた後に実行を継続することがわかります。

この例では、共有ブール変数 isReady を使用して待機状態を表します。待機中のスレッドはクリティカル セクションに入る前に isReady をチェックし、条件が満たされない場合は wait メソッドを呼び出して待機状態に入ります。ウェイクアップ スレッドが条件を満たした後、isReady の値を変更し、notify メソッドを呼び出して待機中のスレッドをウェイクアップします。

待機と通知を使用する場合は、スレッドが同じオブジェクトのロックを確実に取得する必要があることに注意してください。そうしないと、スレッドは適切に待機状態に入ることができず、起動することもできません。

概要

wait メソッドと Notice メソッドを使用すると、複数のスレッド間のコラボレーションを実現し、プログラムの安全性と効率性を確保できます。これら 2 つのメソッドを使用する場合は、ロック、wait メソッドの呼び出し、条件の確認、ロックの解放、notify メソッドの呼び出しなどの正しい手順に従う必要があります。 wait メソッドとnotify メソッドを合理的に使用することで、マルチスレッドの問題を回避し、プログラムの信頼性と保守性を向上させることができます。

以上がJava でオブジェクト メソッド wait と notification を正しく使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート