美文网首页
java wait()和notify()实现生产者-消费者模式

java wait()和notify()实现生产者-消费者模式

作者: 饱饱想要的灵感 | 来源:发表于2023-04-05 14:25 被阅读0次

生产者-消费者模式是一种常见的多线程编程模式,其中生产者线程负责生产数据,消费者线程负责消费数据。在Java中,可以使用wait()和notify()方法来实现生产者-消费者模式。

具体实现步骤如下:

  1. 定义一个共享的数据结构,例如一个队列。
  2. 定义一个生产者线程,该线程负责向队列中添加数据。在添加数据之前,需要获取队列的锁,如果队列已满,则调用wait()方法等待消费者线程消费数据。当消费者线程消费了数据后,会调用notify()方法通知生产者线程可以继续生产数据。
  3. 定义一个消费者线程,该线程负责从队列中消费数据。在消费数据之前,需要获取队列的锁,如果队列为空,则调用wait()方法等待生产者线程生产数据。当生产者线程生产了数据后,会调用notify()方法通知消费者线程可以继续消费数据。

示例代码如下:

import java.util.LinkedList;

public class ProducerConsumerExample {
    private static final int MAX_SIZE = 10;
    private LinkedList<Integer> queue = new LinkedList<>();

    public void produce() throws InterruptedException {
        while (true) {
            synchronized (queue) {
                while (queue.size() == MAX_SIZE) {
                    System.out.println("Queue is full, waiting for consumer to consume...");
                    queue.wait();
                }
                int value = (int) (Math.random() * 100);
                System.out.println("Produced value: " + value);
                queue.add(value);
                queue.notifyAll();
            }
            Thread.sleep(1000);
        }
    }

    public void consume() throws InterruptedException {
        while (true) {
            synchronized (queue) {
                while (queue.isEmpty()) {
                    System.out.println("Queue is empty, waiting for producer to produce...");
                    queue.wait();
                }
                int value = queue.removeFirst();
                System.out.println("Consumed value: " + value);
                queue.notifyAll();
            }
            Thread.sleep(1000);
        }
    }

    public static void main(String[] args) {
        ProducerConsumerExample example = new ProducerConsumerExample();
        Thread producerThread = new Thread(() -> {
            try {
                example.produce();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        Thread consumerThread = new Thread(() -> {
            try {
                example.consume();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        producerThread.start();
        consumerThread.start();
    }
}

在上面的示例代码中,生产者线程和消费者线程都使用了while循环来判断队列是否已满或已空,如果是,则调用wait()方法等待对方的通知。
当生产者线程生产了数据后,会调用notifyAll()方法通知消费者线程可以继续消费数据;当消费者线程消费了数据后,会调用notifyAll()方法通知生产者线程可以继续生产数据。这样就实现了生产者-消费者模式。

相关文章

网友评论

      本文标题:java wait()和notify()实现生产者-消费者模式

      本文链接:https://www.haomeiwen.com/subject/yxgeddtx.html