BlockingQueue是一个线程安全的队列,可以从其中插入或查找元素。此外,它还提供了一种 机制,可以在队列满时阻塞插入新的元素,或者在队列为空时阻塞删除元素,还提供了一个附 加选项,可以在特定超时时停止等待。这些功能使BlockingQueue成为实现消费者生产者模式 的一种很好的方式,因为生产者线程可以插入元素直到BlockingQueue的上限,而消费线程可 以检索元素直到达到下限。
相比于普通的Queue接口,BlockingQueue更适合并发。
在java.util.concurrent包中实现BlockingQueue接口的类主要有以下:

1、 ArrayBlockingQueue 数组阻塞队列
2、 DelayQueue延迟队列
3、 LinkedBlockingDeque链表阻塞双向队列
4、 LinkedBlockingQueue 链表阻塞队列
5、 PriorityBlockingQueue 优先队列
6、 SynchronousQueue 同步队列
BlockingQueue提供了插入、删除和检查元素的方法,这些方法分为四类,具体取决于不能满 足要求时的处理方式差异。当线程尝试在已经满的队列中插入元素或从空队列中移除元素时, 第一类方法抛出异常,第二类方法返回特殊值(例如null或false),第三类方法阻塞线程直 到操作可以完成,第四类方法在放弃线程之前在给定的最大时间限制内阻塞线程。
来分别说说每个队列的特点:
ABQueue:

底层使用的是数组结构。因为数组需要初始化大小,所以其构造器需要输入队列的大小。
是有界的阻塞安全队列(思考:为什么说是有界的?是怎么保证线程安全的?),默认是不保证 线程的公平性(思考:为什么默认不能保证线程公平?如何保证线程安全?),不允许向队列中 插入null元素。
LBQueue:

“有界”的阻塞安全队列,其底层使用的是链表的数据结构。所谓的“有界”是因为,默认队 列的大小是Integer.MAX_VALUE。这个数值等于21亿+。因为这个数据太大了,也可以理解为 无界的。不建议使用默认值,最好在初始化的时候,指定队列的大小。
PBQueue:

是一个支持优先级的无界队列。支持优先级是因为使用了 comparator这个接口。默认采用字 典升序排序策略的。如果不想使用默认的,在初始化的时候,还可以自定义比较器的。
以上三个队列相关更详细的介绍,欢迎回看《Java中常用的七个阻塞队列介绍第一篇》。在这篇文章中,凯哥对这三个队列做了详细的介绍以及代码演示。
DQueue:

是一个支持优先级的无界阻塞队列。支持优先级是应该底层使用的是PriorityQueue队列来实 现的。而PriorityQueue队列在添加元素的时候使用了 siftUpComparab1e方法。这个对了的 一个特点:支持延时获取。所以,这个队列可以运用在缓存系统的设计中。当从队列中获取到数据,说明延时时间到了。
关于DQueue更多详细的介绍,欢迎回看:《Java中常用的七个阻塞队列第二篇DelayQueue源码介绍》。在这篇文章中,凯哥做了详细的介绍,同时使用代码模拟了缓存数据到期操作。,
SyncQueue:
是一个无存储空间的阻塞同步队列。不存储元素的原因是因为,一个put操作必须等待一个 take操作与之对应才可以。否则就不能继续添加元素了。默认使用非公平的。在性能上 SyncQueue队列的吞吐量比LBqueu和ABQueue的性能高。
LTQueue:是由链表组成的无界队列。比其他队列多了两个方法:tryTransfer、transfer
LBDeque:链表组成的双端队列。这个队列在以后凯哥讲For/Join框架的时候,还会说到。

Was this helpful?

0 / 0

发表回复 0

Your email address will not be published.