ホームページ >Java >&#&チュートリアル >Java のオブジェクト メソッドの詳細な分析: 待機と通知

Java のオブジェクト メソッドの詳細な分析: 待機と通知

PHPz
PHPzオリジナル
2023-12-20 12:47:38517ブラウズ

Java のオブジェクト メソッドの詳細な分析: 待機と通知

Java のオブジェクト メソッド: wait と Notice の詳細な説明

Java では、オブジェクト メソッド wait と Notice は、スレッド間のコラボレーションと通信のための重要なツールです。これらは、スレッドが他のスレッドの実行を待機したり、適切なタイミングで起動したりするのに役立ちます。この記事では、wait メソッドと Notice メソッドの使用方法を詳しく紹介し、具体的なコード例を示します。

1. wait メソッドの使用

wait メソッドは、他のスレッドが同じオブジェクトの Notice メソッドを呼び出すか、notifyAll メソッドによってウェイクアップされるまで、現在のスレッドを待機状態にするために使用されます。上。 wait メソッドの形式は次のとおりです。

  1. void wait(): 他のスレッドが起動するまで現在のスレッドを待機させます。
  2. void wait(long timeout): 現在のスレッドを、指定されたミリ秒数の間、または他のスレッドがウェイクアップするまで待機させます。
  3. void wait(long timeout, int nanos): 現在のスレッドは、指定されたミリ秒数に指定されたナノ秒数を加えた時間、または他のスレッドがウェイクアップするまで待機します。

wait メソッドを使用する場合は、オブジェクトを確実にロックするために同期されたコード ブロックにこのメソッドを含める必要があります。以下は典型的な例です。

public class WaitNotifyExample {
    private boolean flag = false;
    
    public synchronized void waitForFlag() {
        try {
            while (!flag) {
                wait(); // 当前线程等待
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        // 执行其他操作
    }
    
    public synchronized void setFlag() {
        flag = true;
        notify(); // 唤醒正在等待的线程
    }
}

上の例では、waitForFlag メソッドを呼び出した後、他のスレッドが setFlag メソッドを呼び出してスレッドを起動するまで、スレッドは待機状態になります。

2. notification メソッドの使用

notify メソッドは、待機中のスレッドをウェイクアップするために使用されます。ウェイクアップするスレッドがランダムに選択されます。複数のスレッドが待機している場合は、そのうちの 1 つだけをウェイクアップできます。通知メソッドの使用形式は次のとおりです。

public class NotifyExample {
    public synchronized void waitForNotify() {
        try {
            wait(); // 当前线程等待
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        // 执行其他操作
    }
    
    public synchronized void notifyThread() {
        notify(); // 唤醒一个等待的线程
    }
}

上記の例では、waitForNotify メソッドを呼び出したスレッドは、他のスレッドが通知スレッド メソッドを呼び出して起動するまで待機状態になります。

3. スレッド間コラボレーションを実現するために待機と通知を使用する

待機メソッドと通知メソッドは、プロデューサー/コンシューマー モデルなどのマルチスレッド コラボレーション シナリオでよく使用されます。

public class ProducerConsumerExample {
    private LinkedList<Integer> buffer = new LinkedList<>();
    private final int MAX_SIZE = 10;
    
    public synchronized void produce() {
        while (buffer.size() == MAX_SIZE) {
            try {
                wait(); // 缓冲区已满,生产者线程等待
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        buffer.add(1);
        notifyAll(); // 唤醒等待的消费者线程
    }
    
    public synchronized void consume() {
        while (buffer.size() == 0) {
            try {
                wait(); // 缓冲区为空,消费者线程等待
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        buffer.removeFirst();
        notifyAll(); // 唤醒等待的生产者线程
    }
}

上の例では、バッファがいっぱいになると、コンシューマ スレッドがバッファ内のコンテンツを消費するまで、プロデューサー スレッドは待機状態に入ります。プロデューサーのスレッドを上げます。バッファが空の場合、コンシューマ スレッドは、プロデューサ スレッドが新しい要素を生成してコンシューマ スレッドをウェイクアップするまで待機状態になります。

概要: wait メソッドと Notice メソッドは、Java でのスレッドのコラボレーションと通信のための重要なツールです。これらはマルチスレッド プログラミングにおいて重要な役割を果たします。 wait メソッドとnotify メソッドを適切に使用することで、スレッド間の洗練されたコラボレーションと通信を実現できます。

以上がJava のオブジェクト メソッドの詳細な分析: 待機と通知の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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