深入理解阻塞队列(一)——基本结构
来源:互联网 发布:js设置span标签隐藏 编辑:程序博客网 时间:2024/06/07 07:13
BlockingQueue是一个继承自Queue的接口,在Queue的队列基础上增加了阻塞操作。简单来说,就是在在BlockingQueue为空时从队头取数据将会被阻塞,因为此时还没有数据可取,一旦队列中有数据了,取数据的线程就会释放得到了数据;如果BlockingQueue有容量限制且满了,那么插入数据的线程将会阻塞,知道队列中有空闲位置可以插入数据了,才会释放。经过上面一段描述,可以发现这不就是一个生产者-消费者模型吗?
示例
下面是BlockingQueue的注释中的一个例子
- 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
- 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
BlockingQueue类结构
BlockingQueue是阻塞队列的顶层接口,其下有很多实现类以及BlockingDeque接口(双端阻塞队列)。关系如下图:
从上图中可以看到整个BlockingQueu的结构都是在Queue的接口上扩展的,下面从Queue开始分析每个类中入队、出队、检索的方法。
Queue接口
可以看到Queue接口的三种操作:入队、出队和检索均有两个实现,区别在于其中一个会在方法执行失败时抛出异常,而另一个会在失败时返回值。下面以入队为例,add()方法在队列已满时将会抛出异常,而offer()在队列已满时会返回false。
BlockingQueue接口
BlockingQueue在Queue接口的基础上对入队和出队两个操作分别又增加了阻塞方法,如下:
其中后面关于设置了时间的入队和出队操作,在时间到了之后如果还未执行成功,那么返回false和null。
Deque接口
Deque是一个双端队列,既支持在队头执行入队出队,也支持在队尾执行出队。而Queue只支持在队头出队,在队尾入队。Deque增加的接口如下:
BlockingDeque接口
BlockingDeque在Deque的基础上增加了阻塞的方法,增加的方法如下:
各个实现类
- ArrayBlockingQueue: 一个基于数组实现的有界阻塞队列,必须设置容量
- LinkedBlockingQueue: 基于链表实现的阻塞队列,容量可以选择进行设置,不设置的话,将是一个无边界的阻塞队列
- PriorityBlockingQueue: 一个无界的阻塞队列,使用的排序规则和PriorityQueue类似并提供了阻塞操作
- LinkedBlockingDeque: 一个基于双端链表的双端阻塞队列,容量可以选择进行设置
总结
需要了解Queue、Deque、BlockingQueue、BlockingDeque四个接口中各个操作中各个方法的区别,比如入队,哪个方法在队列已满的情况会抛出异常,哪个方法会返回false,哪个方法又会阻塞等等。 下一篇博客将会介绍ArrayBlockingQueue,希望感兴趣的朋友继续关注。
- 深入理解阻塞队列(一)——基本结构
- 深入理解阻塞队列(一)——基本结构
- 深入理解JVM(一)------基本结构
- 深入理解JVM(一)------基本结构
- 深入理解JVM(一)------基本结构
- 深入理解阻塞队列(二)——ArrayBlockingQueue源码分析
- 深入理解阻塞队列(三)——LinkedBlockingQueue源码分析
- 深入理解阻塞队列(四)——LinkedBlockingDeque源码分析
- 深入理解JVM(1)—Java虚拟机基本结构
- 深入理解Redis(一)—基本数据结构
- java技术深入(一)——java多线程(七)——阻塞队列,生产者-消费者模式
- 并发理解(阻塞队列)
- 【深入理解JVM】学习笔记——-1、JVM基本结构
- 深入理解JVM--JVM基本结构
- muduo库阅读(3)——基本类型之阻塞队列
- Java同步队列(非阻塞队列与阻塞队列)——java并发容器
- 深入理解Win32结构化异常处理(一)
- [翻译]深入理解Win32结构化异常处理(一)
- javascript原型和闭包之---Function(六)
- 对比svn两个不同分支目录的文件
- c++11自定义线程池
- Linux操作系统4.5.6.7代差别
- Java类加载流程
- 深入理解阻塞队列(一)——基本结构
- HorizontalScrollView与 radioButton 连用
- Linux之文件权限、用户管理
- 解题报告:HDU_6053 TrickGCD 莫比乌斯反演
- 深入理解JVM之四:详解垃圾收集器
- font-size:0的作用
- String类——练习(3)
- httpUtils工具类
- Ubuntu 16.04下安装64位谷歌Chrome浏览器