10019---【Java并发之】BlockingQueue
原文
本文主要讲的是并发包中涉及到的集合,关于普通集合,请参考【java 集合概览】
一、什么是BlockingQueue
BlockingQueue即阻塞队列,从阻塞这个词可以看出,在某些情况下对阻塞队列的访问可能会造成阻塞。被阻塞的情况主要有如下两种:
1. 当队列满了的时候进行入队列操作
2. 当队列空了的时候进行出队列操作
因此,当一个线程试图对一个已经满了的队列进行入队列操作时,它将会被阻塞,除非有另一个线程做了出队列操作;同样,当一个线程试图对一个空队列进行出队列操作时,它将会被阻塞,除非有另一个线程进行了入队列操作。
在Java中,BlockingQueue的接口位于java.util.concurrent 包中(在Java5版本开始提供),由上面介绍的阻塞队列的特性可知,阻塞队列是线程安全的。
二、BlockingQueue的用法
阻塞队列主要用在生产者/消费者的场景,下面这幅图展示了一个线程生产、一个线程消费的场景:
负责生产的线程不断的制造新对象并插入到阻塞队列中,直到达到这个队列的上限值。队列达到上限值之后生产线程将会被阻塞,直到消费的线程对这个队列进行消费。同理,负责消费的线程不断的从队列中消费对象,直到这个队列为空,当队列为空时,消费线程将会被阻塞,除非队列中有新的对象被插入。
三、BlockingQueue接口中的方法
阻塞队列一共有四套方法分别用来进行insert、remove和examine,当每套方法对应的操作不能马上执行时会有不同的反应,下面这个表格就分类列出了这些方法:
这四套方法对应的特点分别是:
1. ThrowsException:如果操作不能马上进行,则抛出异常
2. SpecialValue:如果操作不能马上进行,将会返回一个特殊的值,一般是true或者false
3. Blocks:如果操作不能马上进行,操作会被阻塞
4. TimesOut:如果操作不能马上进行,操作会被阻塞指定的时间,如果指定时间没执行,则返回一个特殊值,一般是true或者false
需要注意的是,我们不能向BlockingQueue中插入null,否则会报NullPointerException。
四、BlockingQueue的实现类
BlockingQueue只是java.util.concurrent包中的一个接口,而在具体使用时,我们用到的是它的实现类,当然这些实现类也位于java.util.concurrent包中。在Java6中,BlockingQueue的实现类主要有以下几种:
1. ArrayBlockingQueue
2. DelayQueue
3. LinkedBlockingQueue
4. PriorityBlockingQueue
5. SynchronousQueue
下面我们就分别介绍这几个实现类。
4.1 ArrayBlockingQueue
ArrayBlockingQueue是一个有边界的阻塞队列,它的内部实现是一个数组。有边界的意思是它的容量是有限的,我们必须在其初始化的时候指定它的容量大小,容量大小一旦指定就不可改变。
ArrayBlockingQueue是以先进先出(FIFO)的方式存储数据,最新插入的对象是尾部,最新移出的对象是头部。下面是一个初始化和使用ArrayBlockingQueue的例子:
BlockingQueue queue = new ArrayBlockingQueue(1024);
queue.put("1");
Object object = queue.take();
4.2 DelayQueue
DelayQueue阻塞的是其内部元素,DelayQueue中的元素必须实现 java.util.concurrent.Delayed接口,这个接口的定义非常简单:
10019---【Java并发之】BlockingQueue相关推荐
- JAVA并发之多线程基础(5)
上面介绍了并发编程中的栅栏等JAVA并发之多线程基础(4) .通过唯一的一个终点线来帮助确定线程是多晚开始执行下一次操作. LockSupport 提供了一个比较底层的线程挂起操作.有点类似于susp ...
- 面试:你说你精通Java并发,给我讲讲Java并发之J.U.C
转载自 面试:你说你精通Java并发,给我讲讲Java并发之J.U.C J.U.C J.U.C即java.util.concurrent包,为我们提供了很多高性能的并发类,可以说是java并发的核心. ...
- JAVA并发之多线程基础(2)
除了我们经常用的synchronized关键字(结合Object的wait()和notify()使用)之外,还有对应的上篇文章讲到的方法JAVA并发之多线程基础(1)之外,我们日常中使用到最多的也就是 ...
- java.util.concurrent BlockingQueue详解
什么是阻塞队列? 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列.这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空.当队列满时,存储元素的线程会等待队列可用.阻塞 ...
- 我的Java开发之路
最近有一位小伙伴通过公众号给我留言, "我参加工作没多久,看着圈里的技术大牛,特别羡慕,也渴望成为技术大牛,想让您分享一下从小白到大牛是怎样练成的,我该如何提高自己" 首先,谢谢这 ...
- Java阻塞队列(BlockingQueue)实现 生产者/消费者 示例
Java阻塞队列(BlockingQueue)实现 生产者/消费者 示例 本文由 TonySpark 翻译自 Javarevisited.转载请参见文章末尾的要求. Java.util.concurr ...
- java并发之SynchronousQueue实现原理
前言 SynchronousQueue是一个比较特别的队列,由于在线程池方面有所应用,为了更好的理解线程池的实现原理,笔者花了些时间学习了一下该队列源码(JDK1.8),此队列源码中充斥着大量的CAS ...
- 你真的弄明白了吗?Java并发之AQS详解
你真的弄明白了吗?Java并发之AQS详解 带着问题阅读 1.什么是AQS,它有什么作用,核心思想是什么 2.AQS中的独占锁和共享锁原理是什么,AQS提供的锁机制是公平锁还是非公平锁 3.AQS在J ...
- 将java.util.concurrent.BlockingQueue用作rx.Observable
在Java中,经典的生产者-消费者模式相对简单,因为我们有java.util.concurrent.BlockingQueue . 为了避免繁忙的等待和容易出错的手动锁定,我们只需利用put()和ta ...
- java线程并发blockingqueue类使用示例
BlockingQueue是一种特殊的Queue,若BlockingQueue是空的,从BlockingQueue取东西的操作将会被阻断进入等待状态直到BlocingkQueue进了新货才会被唤醒,下 ...
最新文章
- mysql两个表条件_mysql – 在另一个表中选择具有多个条件的...
- 产品设计体会(8001)产品经理工作手册
- Python笔记-BeautifulSoup通过查找Id获取元素信息
- (转)淘淘商城系列——MyBatis分页插件(PageHelper)的使用以及商品列表展示
- java中的char类型所占空间
- Intel的AVX2指令集解读
- 【ActiveReports 大数据分析报告】用数据分析的手段告诉你,复联4有多火爆?
- 基于40万表格数据集TableBank,用MaskRCNN做表格检测
- 2010年IT领域的十大收购
- Mysql主备延迟的来源
- HP DV3 笔记本 重装系统
- 如何在浏览器播放amr格式的音频文件
- java web服务_如何用Java实现Web服务器
- office如何从非第一页开始插入页码
- 零基础学C语言 第3版 pdf
- 汽车雨刷器的保养细则
- pip查看安装包的可安装版本
- 第三部分 基本库的使用(urllib库, requests库, re库)
- spring xsd 加载问题
- concourse学习笔记
热门文章
- 三星电视618钜惠火热进行中,6月2日总裁直播惊喜“价”到
- VMware收购Wavefront增强云管理产品组合
- 中国过氧化二异丙苯市场投资状况分析与前景趋势研究报告2022年版
- WordPress编辑器支持pdf上传
- 双重福利:计算机图书满100减50+满99 减10叠加券,更有抽奖送书活动,点击查看!...
- JavaScript “佛祖保佑 永无bug”
- cmarkup 加载字符串_伦敦统一用户组(LUUG)3:字符串和预加载
- 硬盘安装linux镜像文件iso安装,通过ISO文件硬盘安装Ubuntu系统
- 微信公众平台的STRUTS
- Python 实现图片裁剪(附代码) | Python工具