美文网首页
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