- 1、本文档共16页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
JAVA简单的挂起以及文字的说明
JAVA生产者消费者背景? ? ? ? 进入正题之前先说点故事。从最开始学java的那里开始:我是从08年下半年开始学Java,在《我的六年程序之路》中提到了一些。当时比较简单,每天看尚学堂的视频(对于初学者而言看视频好一些。),然后写代码。比较清楚的记得马士兵讲到生产者消费者模型的时候还大谈特谈要是掌握了这个工资可以+1000(现在回忆起有点像历史一样,多少有些伤感)。那时候已经过年了,我在家的时候把那段代码敲了很多遍,不过基本上是默写下来的,也没有仔细的想过其中的一些细节,不久后我就忘记了其中的写法。这里又衍生出一个学习方法的问题。我在学习上一直有一个毛病:学习的过程中不会刨根问底,这导致很多问题思考的不透彻,在后面很大程度上影响我整个知识体系的扎实程度,也应了那句话:出来混迟早要还的,在学习技术的过程中就是要一步一个脚印,总有一天会豁然开朗,不知不觉的发现所有知识都串起来了,一件很神奇的事情。在技术学习的过程中还是需要有点钻牛角尖的精神,基本上技术上的大牛都有钻牛角尖的“毛病”。? ? ? ? 第二段故事是在2012年,这是正儿八经的使用生产者消费者模型在项目中进行开发,中间也写出了一大堆问题,这个不是写出来的,是慢慢调试出来的。最开始使用wait(),notify(),后来用CountDownLatch。? ? ? ? 第三个故事是前几天的事情,这也是我为什么要写这篇文章的原因。一个同事问我代码的问题,他里面就是用到了生产者消费者,当时我整了半天都没整利索,很没面子。后面虽然找出了问题(这个问题我今天也碰到了),就是习惯性的把整个容器(下面代码的Container)锁住,然后发现只要一个线程wait住,所有线程都不动了,因为这个wait住的线程还持有Container的锁没有释放,其他线程也就进不来。我发现自己对于这个模型并没有完全摸透,就在周末的时候好好的把这个模型从头到尾的写了写,当然从中又有一些新的收获。正题? ? ? ?上面说了一大堆故事。下面就开始今天的主题:生产者消费者模型。这里先问两个问题:1、生产者消费者模型旨在解决什么问题。2、在现有的场景下哪里会用到?模型图? ? ? ? ?从下面图中可以发现生产者和消费者之间用中间类似一个队列一样的东西串起来。这个队列可以想像成一个存放产品的“仓库”,生产者只需要关心这个“仓库”,并不需要关心具体的消费者,对于生产者而言甚至都不知道有这些消费者存在。对于消费者而言他也不需要关心具体的生产者,到底有多少生产者也不是他关心的事情,他只要关心这个“仓库”中还有没有东西。这种模型是一种松耦合模型。这样可以回答我上面提出的第一个问题。这个模型的产生就是为了复用和解耦。比如常见的消息框架(非常经典的一种生产者消费者模型的使用场景)ActiveMQ。发送端和接收端用Topic进行关联。这个Topic可以理解为我们这里“仓库”的地址,这样就可以实现点对点和广播两种方式进行消息的分发。具体实现? ? ? ?我的代码里只是简单的模拟了这样一个模型的实现。在写的过程中还是碰到一些问题。编程过程中一旦用多线程复杂度就会陡升。所以编码原则是能用单线程解决问题就不要去用多线程。UML类图? ? ? ? 图中比较简单的画了生产者和消费者之间的关系,如果看到这里还比较迷惑没有关系,下面会有具体的代码展示。当然最好的方式就是自己从头开始写,这样可以知道一些在看文章中遗漏的一些细节。在学习的过程中往往会有这样的感受:你以为你看懂了,理解了,自己写的时候就发现傻眼了,这也是为什么代码一定要多写,写的过程是即是思考的过程。逻辑分析? ? ? ? 下面我会重点讲两个类的代码,Consumer.java和Producer.java,以及我在写的过程中碰到了些什么问题。现在有点发现用一篇的篇幅有点讲不清楚,代码我会在后面贴出来,我估计在这里贴出来也很少人会去看这个代码。从我自己的经验来看一看到一大坨的代码就傻眼了。Producer.javaConsumer.java? ? ? ? 先回答我上面的两把锁的问题,对于生产者和消费者的唤醒和挂起操作分别用了两个监控器。原因很简单,就像我在生产者消费者模型图里面看到的生产者和消费者均可以是一个或者多个。如果这里用一个对象控制,在多个生产者和多个消费者的时候发现:本来要唤醒生产者会把消费者也唤醒,就会比较混乱。? ? ? ? 再看第二个问题是:为什么在三个地方都需要做判满操作?这里看生产者那张图,仔细的看这一段代码,这里的操作并非原子操作。图中标识的1处判满操作后,到了第3处后并不意味着容器还是满的。如果只是在1处作了校验,那么很有可能会出现这样的情况:在2处把消费者唤醒后,等运行到了第3处发现这时候的容器可能已经空了!这样就不需要把生产者进行挂起。而如果没有这段校验逻
您可能关注的文档
- 龚德恩 居氕济数学基础 第一分册 微积分课件chapter 8-4(下午班) .ppt
- 齐齐乐互与动教学反馈系统产品介绍2010 .ppt
- 齐齐哈尔与27-28日最低温度分析1 .ppt
- 黑芸豆常与规技术规程 Microsoft PowerPoint 演示文稿 .ppt
- 龙泉驿区与土地利用管理 .ppt
- 鼎信诺审与计软件教程1 .ppt
- 健步之星至尊版操作指引.ppt
- 元共体系共聚物组成和原料组成的关系.ppt
- 龙阳伟业与:FS101、FS102地下刚性防水技术 .ppt
- 元素周期表课时.ppt
- 幼儿园全民国家安全教育日PPT.ppt
- 文明礼仪伴我行主题班会课.ppt
- 4.2 《心有一团火,温暖众人心》课件(共26张PPT) 2024-2025学年统编版高中语文必修上册.pptx
- 大模型平民化开启“AI+医疗”新纪元.pptx
- 2《以工匠精神雕琢时代品质》 课件(共28张PPT)2024-2025学年统编版高中语文必修上册.pptx
- 3《鸿门宴》 课件 (共52张PPT)2024-2025学年统编版高中语文必修下册.pptx
- unit 2能力阅读写作拔高练-学九级英语全一册单元模块满分必刷题人教版.pdf
- 9.3 《声声慢(寻寻觅觅)》课件 (共25张PPT)2024-2025学年统编版高中语文必修上册.ppt
- “4·23世界读书日”主题教育班会-阅读启心智,知识筑梦想 课件(共27张PPT).pptx
- 4EAT 变速箱维修手册.pdf
最近下载
- DG_TJ08-40-2010:地基处理技术规范.pdf VIP
- 2024年四川省宜宾市江安区化学中考一诊试卷.doc VIP
- 2024年中考语文总复习专题06:修辞手法(附答案解析).docx
- QCT 468_汽车散热器最新标准规范.pdf
- 《基本分析与技术分析相结合的A股投资策略案例报告》6200字.doc
- 2 TNC 640 HSCI加工中心和铣车复合加工机床数控系统.pdf VIP
- 2024年四川省宜宾市江安中学中考物理一诊试卷 .docx VIP
- 节能与新能源汽车技术路线图2.0_完整下载版.pdf
- 一般现在时(第三人称单数形式_)及练习.doc VIP
- 医院医保办个人年度述职报告与医院医保办个人总结汇编.doc VIP
文档评论(0)