Java 并发编程利用 Condition 来实现阻塞队列.docxVIP

Java 并发编程利用 Condition 来实现阻塞队列.docx

  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 并发编程利用 Condition 来实现堵塞队列 2021-08-12 什么是堵塞队列?BlockingQueue 队列是一种数据结构,它的特点是先进先出(First In First Out),它有两个基本操作:在队列尾部加入一个元素,从队列头部移除一个元素。队列在多线程应用中,常用于生产-消费场景。 BlockingQueue 是 Java util.concurrent 包下重要的数据结构,BlockingQueue 供应了线程平安的队列访问方式:当堵塞队列进行插入数据时,假如队列已满,线程将会堵塞等待直到队列非满;从堵塞队列取数据时,假如队列已空,线程将会堵塞等待直到队列非空。并发包下很多高级同步类的实现都是基于 BlockingQueue 实现的。 BlockingQueue 具有 4 组不同的方法用于插入、移除以及对队列中的元素进行检查。假如恳求的操作不能得到马上执行的话,每个方法的表现也不同。这些方法如下:? BlockingQueue 是个接口,你需要使用它的实现之一来使用 BlockingQueue,Java.util.concurrent 包下具有以下 BlockingQueue 接口的实现类: ArrayBlockingQueue:ArrayBlockingQueue 是一个有界的堵塞队列,其内部实现是将对象放到一个数组里。有界也就意味着,它不能够存储无限多数量的元素。它有一个同一时间能够存储元素数量的上限。你可以在对其初始化的时候设定这个上限,但之后就无法对这个上限进行修改了。 DelayQueue:DelayQueue 对元素进行持有直到一个特定的延迟到期。注入其中的元素必需实现 java.util.concurrent.Delayed 接口。 LinkedBlockingQueue:LinkedBlockingQueue 内部以一个链式结构对其元素进行存储。假如需要的话,这一链式结构可以选择一个上限。假如没有定义上限,将使用 Integer.MAX_VALUE 作为上限。 PriorityBlockingQueue:PriorityBlockingQueue 是一个无界的并发队列。它使用了和类 java.util.PriorityQueue 一样的排序规章。你无法向这个队列中插入 null 值。全部插入到 PriorityBlockingQueue 的元素必需实现 java.lang.Comparable 接口。因而该队列中元素的排序就取决于你本人的 Comparable 实现。 SynchronousQueue:SynchronousQueue 是一个特殊的队列,它的内部同时只能够容纳单个元素。假如该队列已有一元素的话,试图向队列中插入一个新元素的线程将会堵塞,直到另一个线程将该元素从队列中抽走。同样,假如该队列为空,试图向队列中抽取一个元素的线程将会堵塞,直到另一个线程向队列中插入了一条新的元素。据此,把这个类称作一个队列明显是夸大其词了。它更多像是一个汇合点。 下面用 BlockQueue 技术来实现一下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 /**?定义一个盘子类,可以放鸡蛋和取鸡蛋?*/?? public?class?BigPlate?{?? ??? ????/**?装鸡蛋的盘子,大小为5?*/?? ????private?BlockingQueue?eggs?=?new?ArrayBlockingQueue(5);?? ??????? ????/**?放鸡蛋?*/?? ????public?void?putEgg(Object?egg)?{?? ????????try?{?? ????????????eggs.put(egg);//?向盘子末尾放一个鸡蛋,假如盘子满了,当前线程堵塞?? ????????}?catch?(InterruptedException?e)?{?? ????????????e.printStackTrace();?? ????????}?? ??? ????????//?下面输出有时不精确?????,由于与put操作不是一个原子操作?? ????????System.out.println(放入鸡蛋);?? ????}?? ??????? ????/**?取鸡蛋?*/??

文档评论(0)

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

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

1亿VIP精品文档

相关文档