ホームページ  >  記事  >  Java  >  Java の wait と notification を深く理解する: スレッド同期メカニズムの分析

Java の wait と notification を深く理解する: スレッド同期メカニズムの分析

WBOY
WBOYオリジナル
2023-12-20 08:44:051401ブラウズ

Java の wait と notification を深く理解する: スレッド同期メカニズムの分析

Java でのスレッド同期: 待機メソッドと通知メソッドの動作原理の分析

Java マルチスレッド プログラミングでは、スレッド間の同期は非常に重要な概念です。実際の開発では、複数のスレッド間の実行順序やリソース アクセスを制御する必要があることがよくあります。スレッドの同期を実現するために、Java には wait メソッドと notification メソッドが用意されています。

wait メソッドと Notice メソッドは、Object クラスの 2 つのメソッドで、Java の監視 (モニター) メカニズムを使用して、スレッド間の調整と通信を実現します。スレッドが特定の条件を待っているとき、オブジェクトの wait メソッドを呼び出すことができ、スレッドは待機状態に入り、オブジェクトのロックを解放します。他のスレッドがオブジェクトの状態を変更すると、オブジェクトの通知メソッドを呼び出して待機中のスレッドに通知することができ、スレッドは再度ロックを競合して実行を継続できるようになります。

待機メソッドと通知メソッドの主な動作原理は次のとおりです。

  1. 待機メソッドの機能は、特定の条件が満たされるまで現在のスレッドを待機状態にすることです。会った。 wait メソッドを呼び出す前に、スレッドはオブジェクトのロックを取得する必要があります。取得していない場合は、IllegalMonitorStateException がスローされます。スレッドが待機状態に入ると、オブジェクトのロックを解放し、待機キューに入ります。待機中のスレッドは、他のスレッドが対応するオブジェクトのnotifyメソッドまたはnotifyAllメソッドを呼び出した場合にのみ起動できます。
  2. 通知メソッドは、待機キュー内のスレッドをウェイクアップして、ロックを取得して実行を続行するために再競合できるようにします。待機キューに複数のスレッドがある場合、どのスレッドが起動されるかは未定義であり、オペレーティング システムのスケジューリング ポリシーによって異なります。通知メソッドは 1 つのスレッドのみを起動しますが、notifyAll メソッドは待機中のすべてのスレッドを起動することに注意してください。

待機メソッドと通知メソッドの使用を示すサンプル コードを以下に示します。

public class WaitNotifyDemo {
    private static final Object lock = new Object();
    private static boolean flag = false;

    public static void main(String[] args) {
        Thread waitThread = new Thread(new WaitTask());
        Thread notifyThread = new Thread(new NotifyTask());

        waitThread.start();

        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        notifyThread.start();
    }

    static class WaitTask implements Runnable {
        @Override
        public void run() {
            synchronized (lock) {
                while (!flag) {
                    try {
                        System.out.println("等待线程进入等待状态");
                        lock.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println("等待线程被唤醒,继续执行");
            }
        }
    }

    static class NotifyTask implements Runnable {
        @Override
        public void run() {
            synchronized (lock) {
                System.out.println("通知线程唤醒等待线程");
                lock.notify();
                flag = true;
            }
        }
    }
}

上の例では、waitThread が最初に実行を開始し、同期に入ろうとしたときに、 blockでは、flagの初期値がfalseなので、waitメソッドを呼び出して待ち状態になります。その後、notifyThread が開始され、2 秒間スリープした後、ロックを取得し、flag の値を true に設定し、notify メソッドを呼び出して待機中のスレッドを起動します。最終的には、waitThread が起動され、wait メソッドの次の場所から実行が続行されます。

この例を通じて、wait メソッドと notification メソッドがどのように機能するかをよりよく理解できます。これらはスレッド間の同期と通信のための重要なツールであり、スレッド間の競合やリソース アクセスの問題を効果的に解決します。実際のアプリケーションでは、待機メソッドと通知メソッドを適切に使用することで、複数のスレッド間のスムーズな連携を確保できます。

以上がJava の wait と notification を深く理解する: スレッド同期メカニズムの分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。