生产者和消费者模式实现(一)

生产者和消费者模式

  • 生产者 生产数据到队列中,消费者从队列中取出数据并消费
  • 关键字synchronized对数据加锁,用Object原生的wait()和notify()做同步

Java 代码

import java.util.LinkedList;
import java.util.Queue;

public class ProducerAndConsumer {
    //队列中最多容纳元素个数
    private final int MAX_LEN=10;
    //可能会产生并发冲突的资源(队列)
    private Queue<Integer> queue=new LinkedList<>();

    //生产者类
    class Producer extends  Thread
    {
        @Override
        public void run() {
            producer();
        }
        public  void producer()  {

            while (true) {
                synchronized (queue) {
                    while (queue.size()==MAX_LEN)
                    {
                        System.out.println("当前队列已满");
//                        通知消费者消费
                        queue.notify();
                        try {
                            //队列满生产者需要等待
                            queue.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    //生产者生产
                    queue.offer(1);
                    //通知消费者消费
                    queue.notify();
                    System.out.println("生产者生产一条消息,当前队列长度为: "+ queue.size());
                    //模拟实际业务所需时间
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {


                    }
                }
            }

        }

    }
    //消费者类
    class Consumer extends  Thread
    {
        @Override
        public void run() {
            consumer();
        }

        public void consumer()
        {
            while (true) {
                synchronized (queue) {
                    while(queue.isEmpty())
                    {

                        System.out.println("当前队列已空");
                        //通知生产者生产
                        queue.notify();
                        try {
                            //队列空消费者需要等待
                            queue.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }

                    }
                    //消费者消费
                    queue.poll();
                    //通知生产者生产
                    queue.notify();
                    System.out.println("消费者消费一条消息,当前队列长度为: "+ queue.size());
                    //模拟实际业务所需时间
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {


                    }
                }
            }


        }
    }

    public static void main(String[] args) {

        ProducerAndConsumer pc=new ProducerAndConsumer();

        Producer producer = pc.new Producer();
        Consumer consumer = pc.new Consumer();

        //启动生产者线程
        producer.start();
        //启动消费者线程
        consumer.start();
    }
}


结果

生产者生产一条消息,当前队列长度为: 1
生产者生产一条消息,当前队列长度为: 2
生产者生产一条消息,当前队列长度为: 3
生产者生产一条消息,当前队列长度为: 4
生产者生产一条消息,当前队列长度为: 5
生产者生产一条消息,当前队列长度为: 6
生产者生产一条消息,当前队列长度为: 7
消费者消费一条消息,当前队列长度为: 6
消费者消费一条消息,当前队列长度为: 5
消费者消费一条消息,当前队列长度为: 4
消费者消费一条消息,当前队列长度为: 3
消费者消费一条消息,当前队列长度为: 2
消费者消费一条消息,当前队列长度为: 1
消费者消费一条消息,当前队列长度为: 0
当前队列已空
生产者生产一条消息,当前队列长度为: 1
生产者生产一条消息,当前队列长度为: 2
生产者生产一条消息,当前队列长度为: 3
消费者消费一条消息,当前队列长度为: 2
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值