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

2023-05-16

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

生产消费者模型是程序设计当中一种非常常见的设计模式,被广泛应用于消息队列以及其他的一些场景当中,,生产消费模型其中包括三者(生产者,消费者,仓库) 顾名思义 生产者为仓库不断生产添加货品,而消费者为仓库不断消耗和减少货品。但是考虑下面出现的两种情况 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();
            }
        }
    }
}  

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

生产消费模型详解以及代码实现(Java) 的相关文章

  • MySQL/MariaDB 查询语句

    基础表 emp 去重查询 DISTINCT 查询职位 SELECT job from emp 显示所有职位 SELECT DISTINCT job FROM emp 查看表中包含的所有job类型 xff0c 重复的只显示一个 输出结果 限制
  • Spring框架通过工厂实现对象实例化过程

  • Eclipse常用设置

    1 界面风格 2 代码字体字号 3 工作空间编码
  • SpringBoot整合HikariCP连接池

    整合 HikariCP 连接池 创建依赖 配置连接池 打开 application properties 配置文件 xff0c 添加如下内容 spring datasource url 61 jdbc mysql dbgoods serve
  • SpringBoot框架整合MyBatis

    添加 MyBatis 启动依赖 参考官网mybatis org spring 找到Spring Boot菜单选项 基于菜单项找到MyBatis启动依赖 xff0c 一定要设置版本 xff0c Spring Boot 中没有设置 MyBati
  • BadTokenException: Unable to add window -- token android.os.BinderProxy

    由于遇到的是BadTokenException这个异常 xff0c 所以搜资料总结了一下 xff1a 这个异常总共有一下几种出现方式 xff1a 1 Unable to add window token null is not valid
  • SpringBoot框架整合SpringMVC、Mybatis框架,对数据库操作的工作原理

    Controller层 Controller层是接收用户访问的url信息 xff0c 再将获取到的内容发送到其他层级进行处理 xff0c 处理完成后返回新的url xff0c 使用户得到想要查询或是其他操作的页面 64 Controller
  • Lombok插件应用

    Lombok安装步骤 https blog csdn net weixin 47253919 article details 119871501 spm 61 1001 2014 3001 5502 常用注解 64 Setter 用于为描述
  • 类的属性(公有属性,受保护属性,私有属性)

    x是类的公有属性 class Animal x 61 10 def test self print Animal x print self x self是类本身 xff0c 等于Animal class Dog Animal def tes
  • linux网络配置(超简单,一看就会)

    2022 11 19 文章目录 前言一 linux网络 xff1f 二 使用步骤 1 查看本机ip 2 进入root用户 3 进入配置网络的目录 4 配置网络 5 重启网络服务 6 查看IP并测试网络 总结 一 linux网络 本章以配置虚
  • 【FPGA】四、按键消抖

    文章目录 一 按键消抖简介 二 按键消抖方式 1 硬件消抖 2 软件消抖 三 程序设计 1 设计思路 2 程序代码 3 仿真验证 总结 一 按键消抖简介 按键在我们日常生活中是很常见的 xff0c 主要有机械按键和虚拟按键 在我们用来进行F
  • 运行npm install出现这种问题怎么解决

    npm ERR code 1 npm ERR path C end springbootdtjr3 master src main resources admin admin node modules node sass npm ERR c
  • java中求平方根

    案例2 求平方根 需求 输入一个大于等于2的整数x xff0c 计算并返回x的平方根 结果只保留整数部分 xff0c 小数部分将被舍去 分析 计算x的平方根 就是x进行开方 开平方的调用函数是Math sqrt 但是要注意的是指保留整数部分
  • 解决Maven配置本地仓库路径不生效问题多个方法详解。(已成功解决自己遇到的问题)

    首先我尝试了很多种方法 xff0c 就是这个方法让我成功 xff0c 和大家分享一下 xff01 xff08 我用方法二成功的 xff01 xff09 maven本地仓库默认值 xff1a 用户家目录 m2 repository 由于本地仓
  • JAVA编写程序,打印九九乘法表(涵盖三种表达形式)

    运用java写出九九乘法表可以概括为三种表达形式 一是长方型 二是正三角型 三是倒三角型 无论是那种 xff0c 用的都是for循环 思路 xff1a 用两个for循环嵌套循环出因子a乘因子b等于乘积 xff0c 外循环代表因子a xff0
  • 【路径规划】蚁群算法机器人栅格地图最短路径规划【含Matlab源码 1618期】

    一 蚁群算法及栅格地图简介 1 蚁群算法 1 1 蚁群算法的提出 蚁群算法 ant colony optimization ACO 又称蚂蚁算法 是一种用来寻找优化路径的机率型算法 它由Marco Dorigo于1992年在他的博士论文中提
  • 遇见Java

    Java是一门面向对象的编程语言 xff0c 不仅吸收了C 43 43 语言的各种优点 xff0c 还摒弃了C 43 43 里难以理解的多继承 指针等概念 xff0c 因此Java语言具有功能强大和简单易用两个特征 Java语言作为静态面向
  • CSS基础-17-拓展-标签居中

    拓展 标签水平居中方法总结 margin 0 auto 如果需要让div p h 大盒子 水平居中 可以通过margin 0 auto 实现 注意点 1 如果需要让 div p h 大盒子 水平居中 xff0c 直接给当前元素本身设置即可
  • 用HTML和css写一个简单地购物小票

    效果图 HTML代码 lt DOCTYPE html gt lt html gt lt head gt lt meta charset 61 34 utf 8 34 gt lt title gt 小票 lt title gt lt link
  • AJAX详解

    1 AJAX是什么 xff1f AJAX即 Asynchronous JavaScript and XML xff08 异步的JavaScript与XML技术 xff09 xff0c 指的是一套综合了多项技术的浏览器端网页开发技术 2 异步

随机推荐

  • 计算机一级必考的10个Excel函数,让我来告诉你

    计算机一级必考的10个Excel函数 xff0c 让我来告诉你 有同学问 xff1a 计算机一级Excel要考哪些函数啊 xff1f xff0c 下图的10个函数就是一级必考的 001 sum求和函数 定义 xff1a 对指定参数进行求和
  • 【一则文章带你了解JavaScript】

    前言 xff1a 想要入门JS xff0c 那我们必须首先了解一下JS的作用 xff0c 我们学习后可以做些什么呢 xff1f 一 首先 xff0c 网页中的表单动态校验以及密码强度的检测是会用到JS的 二 其次 xff0c 我们的网页高级
  • jQuery实现王者荣耀手风琴案例(知识块讲解+案例)

    前言 xff1a 这个案例是几年前的了 xff0c 现在的王者官网是没有这个手风琴模块的 xff0c 我了解到这个案例 xff0c 是受到了黑马程序员知名教师 pink老师的启发 xff0c 我相信大家也都不陌生 xff0c 同样也是我非常
  • 错误问题: Cannot read property ‘XXX‘ of undefined

    undefined不能读取属性XXX 说明定义变量里的值是undefined 查看报错的代码顺藤摸瓜 那打印console看一下 很关键 一定要学会打印 有可能是代码的书写错误了 xff08 大意写错了 xff09 当发现问题后 要学会顺腾
  • Node.js——fs的模块的读取文件-书写文件

    目录 一 fs模块的介绍与初始化 二 fs readFile 读取文件 第二种方法 xff1a 失败演示 xff1a 三 小结 四 fs writeFile 方法向指定文件中写入内容 五 案例 整理用户信息 一 fs模块的介绍与初始化 fs
  • MySQL卸载不干净-MySQL Connector Net xxx文件怎么也删除不了?一招解决它

    相信很多人都遇到过这个问题 xff0c MySQL手动总是卸载不干净 今天没想到让我遇到了 xff0c 那么它就是自讨苦吃 哈哈哈 xff08 这波感谢一下微软 xff0c 为什么 xff1f 大家往下看 xff09 绝招 xff1a 既然
  • uniapp -- 关于uni.navigateTo方法无法跳转的解决方法

    今天做页面跳转的时候遇到了一个问题 xff0c uni navigateTo 方法不是万能的 x1f914 我的需求是在一个component目录下的一个组件中点击遍历出来的组件进入另一个组件 xff0c 我觉得有点绕 xff0c 所以我把
  • Python入门第一章笔记 从安装到编写hello world

    1 下载Python安装包 xff1b 可以到官网下载 xff1a https www python org 但是如果没有翻墙的话 xff0c 下载会很慢 25M安装包 xff0c 需要1个小时以上 如果没有耐心等可以在csdn进行下载 x
  • 谈谈 《 JavaScript - DOM编程艺术 》这本书

    前言 好吧 xff0c 现在已经2023年了 xff0c 对于这本书 xff08 第二版 xff09 来说可能有点老了 xff0c 这本书不是很难理解 xff0c 但也不是很适合新手读 xff0c 当然 xff0c 这本书并不是百宝书 x1
  • 前端程序员 从学校到工作转变的学习历程

    今天是星期一 xff0c 美好而又不是那么美好的上班开始了 xff0c 从学校到职场也有几个月时间了 xff0c 整体来说体验一般般 x1f914 xff0c xff08 请原谅我 这篇文章不配一张图的话 xff0c 会显得文字密密麻麻的
  • 分享项目 - Vue3 + TS + element-ui-plus 项目 -- Table表格表单

    文章目录 前言项目地址以及怎么阅读别人的代码整体代码分页数据作者是怎么处理的 usePagination顺藤摸瓜找到 api 接口的封装api 接口再往底层找全局请求封装与请求拦截器 service ts 前言 今天看一个 ts 项目的 t
  • SpringBoot工程的创建流程

    文章目录 一 初始化时导入的几个基本依赖二 pom文件需要修改的几个地方三 pom文件需要再增加的几个依赖四 maven仓库记得改成自己电脑本地的 xff01 xff01 xff01 五 报错的关于test目录的两个包六 根据数据创建实体类
  • 在matlab中使用find()函数删选数据

    find xff08 xff09 函数 可以查找非零元素的索引和值 拿具体实例来讲 clear clc A 61 1 2 3 456 66 77 343 44 4 3 4 5 A find A 2 gt 61 50 61 删选出A矩阵中第二
  • 【数据结构】二叉树的构建(C语言实现)

    1 树概念及结构 1 1树的概念 树是一种非线性 的数据结构 xff0c 它是由n xff08 n gt 61 0 xff09 个有限结点组成一个具有层次关系的集合 把它叫做树是因 为它看起来像一棵倒挂的树 xff0c 也就是说它是根朝上
  • 解决resultMap报错

    发现问题是使用resultMap来指定类型封装结果的时候出现错误 错误如下 首先排除代码层面的错误 点开错误也没有发现原因 经过查找原来是数据库的字段名和实体的实体名不一致 resultMap则不能自动封装数据 使用reultType 也并
  • Linux防火墙——iptables以及firewalld的使用介绍

    本文基于Linux上CentOS 7版本配合iptables iptables services firewalld等服务进行演示 一 防火墙概念以及Netfilter机制介绍 1 概念 2 防火墙两大类型 3 Netfilter功能 二
  • AOP是什么?如何使用AOP?

    AOP 基本概念是什么 xff1f 什么是AOP xff1f AOP 就是面向切面编程 xff0c 或者叫面向方面编程 xff0c 或者开玩笑的说叫面向方便面编程 在软件业 xff0c AOP为Aspect Oriented Program
  • 情人节浪漫表白,程序员的专属浪漫-----烟花表白

    谁说程序员不懂浪漫 xff1f for birth death love 43 43 do love 43 43 while death 可执行的exe文件我放在文章后面了 xff01 直接双击点开就可以使用了 最终效果 xff1a 运行环
  • 养老产业政策链接

    江西省养老政策文件 xff1a 江西省养老服务条例 http mzw ganzhou gov cn gzsmzjy c103172 202201 d238525b35bb47b49b3de312c9b63a60 shtml 南昌市养老服务体
  • 生产消费模型详解以及代码实现(Java)

    生产消费模型的由来以及定义 xff1a 生产消费者模型是程序设计当中一种非常常见的设计模式 xff0c 被广泛应用于消息队列以及其他的一些场景当中 xff0c xff0c 生产消费模型其中包括三者 xff08 生产者 xff0c 消费者 x