经典消费者生产者问题

article/2025/8/20 22:45:39

首先你需要了解多线程的流程以及实现多线程的几种方法,同时你要理解什么是并行、并发,以及线程和进程的区别,这里做简要的区别。
线程:一个进程包括多个线程
并行:多个cpu实例或者多台机器同时执行一段处理逻辑,是真正的同时。
并发:通过cpu调度算法,让用户看上去同时执行,实际上从cpu操作层面不是真正的同时。并发往往在场景中有公用的资源,那么针对这个公用的资源往往产生瓶颈,我们会用TPS或者QPS来反应这个系统的处理能力。
之前看到过一篇博客,我觉得很形象的解释了并行和并发,下面我借用他的一个图片解释一下
这里写图片描述
就如同喝咖啡一样,并行是让一杯咖啡被两种人同时喝,而并发是有可能有两杯咖啡,两种人同时喝,看起来是同时进行,但不是真正的同时。
多线程的基本流程
新建状态(New):当线程对象对创建后,即进入了新建状态,如:Thread t = new MyThread();

就绪状态(Runnable):当调用线程对象的start()方法(t.start();),线程即进入就绪状态。处于就绪状态的线程,只是说明此线程已经做好了准备,随时等待CPU调度执行,并不是说执行了t.start()此线程立即就会执行;

运行状态(Running):当CPU开始调度处于就绪状态的线程时,此时线程才得以真正执行,即进入到运行状态。注:就 绪状态是进入到运行状态的唯一入口,也就是说,线程要想进入运行状态执行,首先必须处于就绪状态中;

阻塞状态(Blocked):处于运行状态中的线程由于某种原因,暂时放弃对CPU的使用权,停止执行,此时进入阻塞状态,直到其进入到就绪状态,才 有机会再次被CPU调用以进入到运行状态。根据阻塞产生的原因不同,阻塞状态又可以分为三种:

1.等待阻塞:运行状态中的线程执行wait()方法,使本线程进入到等待阻塞状态;

2.同步阻塞 – 线程在获取synchronized同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态;

3.其他阻塞 – 通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。

死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。
这里写图片描述
好了下面进入我们的生产者消费者问题
生产者消费者问题
考虑一个程序的怎么写首先应该有大概的流程,生产消费问题其实也就是生产——仓库——消费 模型
1.首先应该建立仓库类、消费者类、生产者类、以及最终的测试类。
2.我们应该判断的是如果消费者消耗光仓库的食物,我们应该让消费者们等待,然后notifyAll所有的生产者,直到生产者生产的食物等于仓库容量,我们可以停止生产,进入wait状态,然后唤醒所有消费者消费食物。大体的思路就是这样。
下面用真正的代码实现

仓库类

package com.cn.hnust.controller;import sun.org.mozilla.javascript.internal.Synchronizer;import java.util.LinkedList;public class CangKu  {private final int MAX_SIZE=100; //仓库最大容量LinkedList<Object> linkedList= new LinkedList();//载体public LinkedList<Object> getLinkedList() {return linkedList;}public void setLinkedList(LinkedList<Object> linkedList) {this.linkedList = linkedList;}/*** 生产者方法* @param num*/public  void produce(int num ){synchronized (linkedList){while(linkedList.size()+num>MAX_SIZE){System.out.println("不能生产,食物够用"+num+"size==="+linkedList.size());try {linkedList.wait();}catch (Exception e){e.printStackTrace();}}for (int i=1;i<=num;++i){linkedList.add(new Object());}System.out.println("已经生产" +num+"总共有"+linkedList.size());linkedList.notifyAll();}}public int getMAX_SIZE() {return MAX_SIZE;}/*** 消费者方法* @param num*/public void consoume(int num ){synchronized (linkedList){while(linkedList.size()<num){try {System.out.println("消费"+num +"size"+linkedList.size());linkedList.wait();}catch (Exception e){e.printStackTrace();}}for (int i=1;i<=num;++i){linkedList.remove();}System.out.println("【已经消费产品数】:" + num + "/t【现仓储量为】:" + linkedList.size());linkedList.notifyAll();}}
}

生产类

package com.cn.hnust.controller;public class proudcter extends Thread {
private  int num;public int getNum() {return num;}public void setNum(int num) {this.num = num;}public CangKu getCangKu() {return cangKu;}public void setCangKu(CangKu cangKu) {this.cangKu = cangKu;}private CangKu cangKu;
public proudcter(CangKu cangKu){this.cangKu=cangKu;
}public void proudce(int num) {cangKu.produce(num);}public void run(){proudce(num);
}
}

消费者类

package com.cn.hnust.controller;public class consumers extends Thread {private  int num;public int getNum() {return num;}public void setNum(int num) {this.num = num;}public CangKu getCangKu() {return cangKu;}public void setCangKu(CangKu cangKu) {this.cangKu = cangKu;}private CangKu cangKu;public consumers(CangKu cangKu1){this.cangKu=cangKu1;}public void consum(int num) {cangKu.consoume(num);}public void run(){consum(num);}
}

主类

package com.cn.hnust.controller;public class PCTest {public static void main(String[] args) {CangKu cangKu =new CangKu();proudcter proudcter =new proudcter(cangKu);proudcter proudcter1 =new proudcter(cangKu);proudcter proudcter2 =new proudcter(cangKu);proudcter proudcter3 =new proudcter(cangKu);proudcter proudcter4 =new proudcter(cangKu);proudcter proudcter5 =new proudcter(cangKu);consumers consumers =new consumers(cangKu);consumers consumers1 =new consumers(cangKu);consumers consumers2 =new consumers(cangKu);consumers consumers3 =new consumers(cangKu);proudcter.setNum(10);proudcter1.setNum(10);proudcter2.setNum(10);proudcter3.setNum(90);proudcter4.setNum(10);proudcter5.setNum(80);consumers.setNum(50);consumers1.setNum(20);consumers2.setNum(60);consumers3.setNum(10);consumers.start();consumers1.start();consumers2.start();consumers3.start();proudcter.start();proudcter1.start();proudcter2.start();proudcter3.start();proudcter4.start();proudcter5.start();}
}

以上就是生产者消费者问题,如果有不对之处,希望指出。共同进步,谢谢。


http://chatgpt.dhexx.cn/article/wMfGy0AY.shtml

相关文章

【报告分享】德勤:2023中国消费者洞察与市场展望.pdf(附下载链接)

省时查报告-专业、及时、全面的行研报告库 省时查方案-专业、及时、全面的营销策划方案库 【免费下载】2022年12月份热门报告盘点 罗振宇2023年跨年演讲PPT原稿吴晓波2022年年终秀演讲PPT原稿2023年&#xff0c;如何科学制定年度规划&#xff1f; 《底层逻辑》高清配图 华为202…

2023中国消费者洞察报告

下载报告去公众号&#xff1a;硬核刘大 后台回复“ 消费者洞察”&#xff0c;即可下载完整PDF文件。 更多报告内容&#xff0c;可加微信&#xff1a;chanpin628 领取。(ps&#xff1a;加过微信&#xff1a;chanpin628 的不要再加&#xff0c;分享的内容一样&#xff0c;有一个…

大数据营销更需要消费者洞察

2013年10月17日&#xff0c;独立商业趋势观察家&#xff0c;知名中国消费趋势研究专家&#xff0c;数字营销专家肖明超先生&#xff0c;应凤凰网的邀请参加了凤凰网在广州举办的“营销人的幸福梦”主题沙龙活动&#xff0c;并与凤凰网副总裁徐进、琥珀传播CEO刘阳&#xff0c;一…

消费者消费消息分析

消费者读流程 】每个consumer都可以根据分配策略&#xff08;默认RangeAssignor&#xff09;&#xff0c;获得要消费的分区 】 获取到consumer对应的offset&#xff08;默认从ZK中获取上一次消费的offset&#xff09; 】 找到该分区的leader&#xff0c;拉取数据 】 消费者提交…

消费者详解-消费消息(1)

文章目录 消费者消费消息流程Pull消费流程1. 初始化消费者2. 拉取topic的消息队列3. 拉取消费位点4. 根据消费位点消费消息5. 保存消费进度拉取消息-pullKernelImpl Broker处理拉取消息请求1、权限、参数校验并且获取初始化变量&#xff1a;2、获取拉取消息的topic配置3、解析订…

直播报名 | 海外社交媒体趋势如何?出海品牌如何掌握消费者洞察?

近年来&#xff0c;中国品牌出海势头强劲&#xff0c;智能硬件、互联网应用、时尚服饰等正加速风靡海外市场&#xff0c;涌现出像安克创新、SHEIN这样的全球化品牌。有人提问&#xff0c;安克创新&#xff0c;凭借什么成为全球化品牌&#xff1f;出海企业可以从中借鉴什么&…

Kafka消费者不消费数据

背景&#xff1a; 工作往往是千篇一律&#xff0c;真正能学到点知识都是在上线后。使用SkywalkingKafkaES进行应用监控。 现象&#xff1a; 公司使用Skywalking在开发测试环境中Kafka顺利消费数据&#xff0c;到了UAT环境一开始还正常&#xff0c;后面接入了更多的应用后出现…

食品品牌如何做好消费需求洞察直抵消费者心智

做生意的都明白这样一个道理&#xff1a;“先找到买主&#xff0c;再依照需求出售”。之所以这一点很重要&#xff0c;因为这揭示了一条经营企业过程中必须遵守的金科玉律&#xff1a;先有需求&#xff0c;而后才有你的品牌、服务或功能。 需求洞察是品牌、产品、服务等一切的…

消费者洞察:数据影响消费,消费营造数据

本文根据Stratifyd资深解决方案经理段鑫龙(Bruce Duan)在9月24日的直播演讲内容整理,演讲围绕“如何洞察消费者”从四个层面展开:首先是(疫情期间以及后疫情时代)消费品行业的发展现状和未来趋势;然后是当前现状下如何通过数据化闭环洞察消费者;有了前面的理论支撑和方…

助力品牌洞察——消费者情绪行为分析

什么是情绪分析&#xff1f; 随着社交网络和数字营销的出现&#xff0c;消费者对产品和品牌的评价受到越来越多的关注。在线用户反馈&#xff08;例如产品评价、社交媒体评论和调查问卷等&#xff09;包含了大量具有价值的数据。通过这些数据&#xff0c;可以了解消费者对您产…

数据分析:消费者数据分析

数据分析&#xff1a;消费者数据分析 作者&#xff1a;i阿极 作者简介&#xff1a;Python领域新星作者、多项比赛获奖者&#xff1a;博主个人首页 &#x1f60a;&#x1f60a;&#x1f60a;如果觉得文章不错或能帮助到你学习&#xff0c;可以点赞&#x1f44d;收藏&#x1f4c1…

消费者洞察:案例透视消费者洞察实践与收益

本文根据Stratifyd资深解决方案经理段鑫龙(Bruce Duan)在“如何洞察您的消费者”直播课主题演讲整理。点击链接(https://live.vhall.com/534333188)查看完整演讲视频,关注Stratifyd微信公众号并在后台回复“粉丝群”,还可进群申领演讲课件,及时关注Stratifyd最新培训资讯…

消费者洞察:一文看懂消费者是如何做选择的

作者&#xff1a;付永承 全文共 4214 字&#xff0c;阅读需要 9 分钟 ———— / BEGIN / ———— “为什么有时候明明比对手更有优势&#xff0c;产品就是无人问津&#xff1f;” “为什么花了那么多广告费&#xff0c;销量怎么就是上不来&#xff1f;” “为什么之前的营销…

消费者洞察:数据化闭环洞察消费者

本文根据Stratifyd资深解决方案经理段鑫龙(Bruce Duan)在“如何洞察您的消费者”直播课主题演讲整理。上周我们通过“数据影响消费,消费营造数据”这篇文章了解了消费品行业的发展现状,新生代互联网消费者更乐于分享表达,然而消费者触点分散,对企业洞察消费者、了解消费者…

系统资源不足,无法完成请求服务。

使用visual studio 编译时&#xff1a; 清理了磁盘…重装了VS2019 没用… 后来一个学长说试试卸载McAfee well done!

win10突然提示系统资源不足,无法完成请求服务的解决方法(VS)win10跑代码变慢

大概率是McAfee搞得鬼 解决方法&#xff1a;点击PC安全-实时扫描-关闭 电脑也快多了&#xff0c;跑代码也快了很多 直接卸载McAfee也可

c语言无纸化软件系统资源不足,系统资源不足无法完成请求的服务怎么办_系统资源不足卸载迈克菲解决教程 - 系统家园...

最近很多用户在问小编系统资源不足无法完成请求的服务怎么解决&#xff0c;小编电脑没有遇到这个问题&#xff0c;但是看到了贴吧很多小伙伴都有这个问题&#xff0c;发现有个共性就是装了迈克菲McAfee杀毒防护软件&#xff0c;下面快点来看看怎么解决问题吧。 系统资源不足卸载…

windows远程拷贝和解压大文件异常:系统资源不足无法完成请求的服务

windows服务器异常&#xff1a;系统资源不足无法完成请求的服务 Insufficient system resources exist to complete the requested service. by qunying.liu(刘群英) 问题描述&#xff1a; 开发人员需要将线上环境windows的某些数据文件复制到开发环境windows用于测试&#xff…

c语言无纸化软件系统资源不足,win10系统安装软件显示“系统资源不足,无法完成请求的服务”的解决方法...

相信不少网友在win10系统安装软件时都遇到过“系统资源不足&#xff0c;无法完成请求的服务”的情况&#xff0c;到底是怎么回事&#xff1f;检查内存空间都足够大的&#xff0c;其实往往导致这一问题的不是存储空间不足问题&#xff0c;而是病毒问题。知道原因后&#xff0c;问…

c语言无纸化软件系统资源不足,win10系统安装软件显示“系统资源不足,无法完成请求的服务”的解决方法-系统城...

相信不少网友在win10系统安装软件时都遇到过“系统资源不足&#xff0c;无法完成请求的服务”的情况&#xff0c;到底是怎么回事&#xff1f;检查内存空间都足够大的&#xff0c;其实往往导致这一问题的不是存储空间不足问题&#xff0c;而是病毒问题。知道原因后&#xff0c;问…