java生产者消费者问题概述.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
java 生产者消费者问题 引言 生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况: 生产者消费者图 存储空间已满,而生产者占用着它,消费者等着生产者让出空间从而去除产品,生产者等着消费者消费产品,从而向空间中添加产品。互相等待,从而发生死锁。 生产者消费者问题是研究多线程程序时绕不开的经典问题之一,它描述是有一块缓冲区作为仓库,生产者可以将产品放入仓库,消费者则可以从仓库中取走产品。解决生产者/消费者问题的方法可分为两类: (1)采用某种机制保护生产者和消费者之间的同步; (2)在生产者和消费者之间建立一个管道。 第一种方式有较高的效率,并且易于实现,代码的可控制性较好,属于常用的模式。第二种管道缓冲区不易控制,被传输数据对象不易于封装等,实用性不强。因此本文只介绍同步机制实现的生产者/消费者问题。 同步问题核心在于:如何保证同一资源被多个线程并发访问时的完整性。常用的同步方法是采用信号或加锁机制, 保证资源在任意时刻至多被一个线程访问。Java语言在多线程编程上实现了完全对象化,提供了对同步机制的良好支持。在Java中一共有四种方法支持同 步,其中前三个是同步方法,一个是管道方法。 (1)wait() / notify()方法 (2)await() / signal()方法 (3)BlockingQueue阻塞队列方法 (4)PipedInputStream / PipedOutputStream 本文只介绍最常用的前两种种,第三、四种暂不做讨论,有兴趣的读者可以自己去网上找答案。 一、wait() / notify()方法 wait() / nofity()方法是基类Object的两个方法,也就意味着所有Java类都会拥有这两个方法,这样,我们就可以为任何对象实现同步机制。 wait()方法:当缓冲区已满/空时,生产者/消费者线程停止自己的执行,放弃锁,使自己处于等等状态,让其他线程执行。 notify()方法:当生产者/消费者向缓冲区放入/取出一个产品时,向其他等待的线程发出可执行的通知,同时放弃锁,使自己处于等待状态。 代码实现: 1、仓库类 import?java.util.LinkedList;??? ? /**?? ?*?仓库类Storage实现缓冲区?? ?*??? ?*?@author?zcr?? ?*/??? public?class?Storage??? {??? ????//?仓库最大存储量??? ????private?final?int?MAX_SIZE?=?100;??? ??? ????//?仓库存储的载体??? ????private?LinkedListObject?list?=?new?LinkedListObject();??? ??? ????/**? ?????*?生产num个产品? ?????*?@param?num?生产产品的数量? ?????*/? ????public?void?produce(int?num)??? ????{??? ????????//?同步代码段??? ????????synchronized?(list)??? ????????{??? ????????????//?如果仓库剩余容量不足??? ????????????while?(list.size()?+?num??MAX_SIZE)??? ????????????{??? ????????????????System.out.println(【要生产的产品数量】:?+?num?+??\t?【库存量】:??? ????????????????????????+?list.size()?+?\t?暂时不能执行生产任务!);??? ????????????????try??? ????????????????{??? ????????????????????//?由于条件不满足,生产阻塞??? ????????????????????list.wait();??? ????????????????}??? ????????????????catch?(InterruptedException?e)??? ????????????????{??? ????????????????????e.printStackTrace();??? ????????????????}??? ????????????}??? ??? ????????????//?生产条件满足情况下,生产num个产品??? ????????????for?(int?i?=?1;?i?=?num;?++i)??

文档评论(0)

a336661148 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档