生产消费模型详解以及代码实现(Java)

生产消费模型的由来以及定义:

生产消费者模型是程序设计当中一种非常常见的设计模式,被广泛应用于消息队列以及其他的一些场景当中,,生产消费模型其中包括三者(生产者,消费者,仓库) 顾名思义 生产者为仓库不断生产添加货品,而消费者为仓库不断消耗和减少货品。但是考虑下面出现的两种情况 1.生产者一直生产为仓库添加商品,而消费者购买力 消费力不足 这样就会造成大量的浪费 出现产能过剩 2.消费者消费能力过强,而生产者生产能力跟不上,造成手忙脚乱,供不应求。 于是在其中就需要一个中间商来通知消费者和生产者 对两者之间进行一个调度,于是便有了生产消费者模型。

如下图所示(仓库为空的时候 消费者进入wait notify生产者进行,反之仓库满了的时候,生产者进入wait 消费者进入notify唤醒运行)

1.对仓库类别进行一个定义,设置一个最大值 以及当前物品数量的记录,当

2.对消费者进行定义(消费者的线程类)

3.对生产者进行定义(生产者线程类别)

 4.期间生产者调用add方法为仓库添加 消费者调用remove方法进行消耗(synchronized保障线程的安全)

 5.部分源码如下

public static void main(String[] args) {
    Factory factory = new Factory(50);

    Producer producer = new Producer(factory);
    Producer producer2 = new Producer(factory);
    Consumer consumer = new Consumer(factory);

    new Thread(producer).start();
    new Thread(producer2).start();
    new Thread(consumer).start();

public synchronized void add(){
    //如果工厂没有满,就生产物品
    if (num < max){
        num++;
        System.out.println("生产了一件商品,现在仓库中还有:" + num + "件物品");
        //唤醒等待的消费者来消费
        notifyAll();
    }else {
        try {
            //工厂满了,生产者等待
            System.out.println("仓库满了,生产者等待");
            wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
public synchronized void remove(){
        if (0 < num){
            num--;
            System.out.println("消费了一件物品,还剩下:" + num + "件物品");
            //唤醒等待的生产者来生产物品
            notifyAll();
        }else {
            try {
                //没有东西可以被消费了,该线程等待
                System.out.println("仓库没货了");
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

网友小浩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值