ホームページ  >  記事  >  Java  >  Javaのオブジェクトメソッドwaitとnotifyの機能と応用を学ぶ

Javaのオブジェクトメソッドwaitとnotifyの機能と応用を学ぶ

WBOY
WBOYオリジナル
2023-12-20 11:39:29895ブラウズ

Javaのオブジェクトメソッドwaitとnotifyの機能と応用を学ぶ

Java のオブジェクト メソッドを理解する: wait と Notice の役割と使用法

Java では、オブジェクト メソッドは並行プログラミングを実装するための重要なツールです。その中で、wait と notification はよく使用される 2 つのメソッドであり、スレッドの待機とウェイクアップ操作を実装するために使用されます。この記事では、これら 2 つの方法を詳しく紹介し、具体的なコード例をいくつか示します。

wait メソッドは、Object クラスで定義されたメソッドで、他のスレッドが同じオブジェクトの Notice メソッドまたは NotifyAll メソッドを呼び出してウェイクアップするまで、現在のスレッドを待機状態にするために使用されます。 wait メソッドを呼び出す前に、スレッドはまずオブジェクトのモニター ロックを取得する必要があります。 wait メソッドには 2 つのオーバーロード形式があります。

  1. wait(): 現在のスレッドを、他のスレッドがウェイクアップするまで待機させます。
  2. wait(long timeout): 現在のスレッドを、指定されたミリ秒数の間、または他のスレッドがウェイクアップするまで待機させます。

次は、wait メソッドを使用してプロデューサー/コンシューマー モデルを実装するサンプル コードです。

public class ProducerConsumer {
    private final Object lock = new Object();
    private List<String> buffer = new ArrayList<>();
    private int bufferSize = 10;
    
    public void produce() throws InterruptedException {
        synchronized (lock) {
            // 判断缓冲区是否已满
            while (buffer.size() == bufferSize) {
                lock.wait(); // 等待消费者消费
            }
            // 生产物品到缓冲区
            buffer.add("Item");
            System.out.println("生产者生产一个物品,缓冲区大小:" + buffer.size());
            // 唤醒等待的消费者线程
            lock.notifyAll();
        }
    }
    
    public void consume() throws InterruptedException {
        synchronized (lock) {
            // 判断缓冲区是否为空
            while (buffer.isEmpty()) {
                lock.wait(); // 等待生产者生产
            }
            // 从缓冲区消费物品
            String item = buffer.remove(0);
            System.out.println("消费者消费一个物品,缓冲区大小:" + buffer.size());
            // 唤醒等待的生产者线程
            lock.notifyAll();
        }
    }
}

上記のコードでは、プロデューサーは wait メソッドを使用して自分自身をバッファーがいっぱいでない場合に、Produce を再度バッファリングするまでの待機状態。コンシューマーは、wait メソッドを使用して、バッファーが空でなくなるまで待機状態にしてから消費します。プロデューサがアイテムを生成するか、コンシューマがアイテムを消費すると、オブジェクトのnotifyAllメソッドが呼び出され、待機中のスレッドが起動されます。

notify メソッドも Object クラスで定義されたメソッドで、同じオブジェクトを待っているスレッドを起動するために使用されます。 NoticeAll メソッドとは異なり、notify メソッドはスレッドの 1 つだけをウェイクアップできます。以下は、notify メソッドの使用例です。

public class ThreadMonitor {
    private final Object lock = new Object();
    
    public void performTask() throws InterruptedException {
        synchronized (lock) {
            System.out.println("线程" + Thread.currentThread().getId() + "开始执行任务");
            lock.wait(); // 等待唤醒
            System.out.println("线程" + Thread.currentThread().getId() + "继续执行任务");
        }
    }
    
    public void wakeUpThread() {
        synchronized (lock) {
            lock.notify(); // 唤醒等待的线程
        }
    }
}

上記のコードでは、他のスレッドが wakeUpThread メソッドを呼び出してウェイクアップするまで、performTask メソッドはスレッドを待機状態にします。 wakeUpThread メソッドは、notify メソッドを使用して待機中のスレッドを起動します。

wait メソッドと Notice メソッドを使用する場合は、最初にオブジェクトのモニター ロックを取得する必要があることに注意してください。つまり、それを同期コード ブロックまたは同期メソッドで使用する必要があります。

要約すると、待機と通知は、Java でスレッド間通信を実現するための重要なメソッドです。これらは、スレッドの待機およびウェイクアップ操作を実装でき、複数のスレッドの実行シーケンスを調整したり、共有リソースにアクセスしたりするために使用されます。この記事で提供されているコード例は、読者がこれら 2 つのメソッドの使用法をより深く理解するのに役立ちます。 wait メソッドとnotify メソッドを適切に利用することで、より安全で効率的なマルチスレッド プログラムを作成できます。

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

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