生产者与消费者模型

Java多线程

进程与线程
Java线程
线程状态的切换
同步与锁



前言

今天来学习经典的生产者消费者模型


提示:以下是本篇文章正文内容,下面案例可供参考

一、生产者消费者模型是干什么的?

生产者消费者模型是存在一批生产者,一批消费者,一个仓储,同时按以下条件进行生产消费
1.生产者只有在仓储没有满的时候进行生产,仓储满的时候进行等待
2.消费者只有在仓储存在货物的时候才进行消费,仓储空了则进行等待
3.消费者在仓储没有货物的时候应该通知生产者进行消费
4.生产者在生产完之后应该通知消费者消费

二、生产者

生产者只进行生产,代码如下(示例):

    class Producer extends Thread{
        //生产产品的数量
        private int productNum;
        //仓库
        private Godown godown;

        Producer(int productNum,Godown godown){
            this.productNum = productNum;
            this.godown = godown;
        }

        @Override
        public void run(){
            godown.doProduct(this.productNum);
        }
    }

三、消费者

消费者负责进行消费,代码如下(示例):

    class ConSumer extends Thread{
         //消费的数量
        private int conSumNum;
        //仓库
        private Godown godown;

        ConSumer(int conSumNum,Godown godown){
            this.conSumNum = conSumNum;
            this.godown = godown;
        }

        @Override
        public void run(){
            godown.doConSum(this.conSumNum);
        }
    }

四、仓库

仓库进行货物的存储,为确保货物的正确出入库,因此要对入库和出库进行同步操作避免数据出现不一致,同时在入库和出库的时候要通知到生产者和消费者进行生产和消费,代码如下所示

    /**
     * 仓库
     */
     class Godown{
        //最大库存
        public static final int max_size = 100;

        //当前库存
        public int curNum;

        Godown(){

        }

        Godown(int curNum){
            this.curNum = curNum;
        }

        /**
         * 生产指定数量的产品,修改成同步方法
         */
        public synchronized void doProduct(int productNum){
            while (this.curNum+productNum>max_size){
                System.out.println("当前库存:"+ this.curNum +"+生产的数量:"+productNum+">最大库存100将等待");
                try {
                    //线程等待
                    wait();
                }catch (Exception e){
                    e.printStackTrace();
                }
            }

            curNum += productNum;
            System.out.println("已经生产了" + productNum + "个产品,现仓储量为" + curNum);
            //唤醒在此对象等待的线程
            notifyAll();
        }

最终代码如下:

    public static void main(String[] args){
        Godown godown = new ProductConsomerDemo().new Godown(10);
        Producer producer1 = new ProductConsomerDemo().new Producer(10,godown);
        Producer producer2 = new ProductConsomerDemo().new Producer(20,godown);
        Producer producer3 = new ProductConsomerDemo().new Producer(30,godown);
        Producer producer4 = new ProductConsomerDemo().new Producer(40,godown);
        ConSumer conSumer1 = new ProductConsomerDemo().new ConSumer(10,godown);
        ConSumer conSumer2 = new ProductConsomerDemo().new ConSumer(10,godown);
        ConSumer conSumer3 = new ProductConsomerDemo().new ConSumer(10,godown);
        ConSumer conSumer4 = new ProductConsomerDemo().new ConSumer(10,godown);

        producer1.start();
        producer2.start();
        producer3.start();
        producer4.start();
        conSumer1.start();
        conSumer2.start();
        conSumer3.start();
        conSumer4.start();
    }

在这里插入图片描述


总结

在生产者消费者模型当中,生产者消费者只负责自己单一的职责,仓储则是做为控制生产者消费者进程的等待和唤醒,当仓储满的时候,此时生产者线程将进行wait(),当一个消费者成功消费的时候将notifyAll()唤醒生产者线程进行生产。
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值