JUC(三)
1、阻塞队列
BlockingQueue接口实现类 | 说明 |
---|---|
ArrayBlockingQueue | 基于数组结构的有界阻塞队列,此队列按FIFO原则对元素进行排序 |
LinkedBlockingQueue | 底层链表,有界(默认Integer.MAX_VALUE)吞吐量通常高于ArrayBlockingQueue |
SynchronousQueue | 一个不存储元素的阻塞队列,每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态 |
PriorityBlockingQueue | 支持优先级排序的无界阻塞队列 |
DelayQueue | 使用优先级队列实现的延迟无界阻塞队列 |
LinkedTransferQueue | 由链表实现的无界阻塞队列 |
LinkedBlockingDeque | 由链表实现的双向阻塞队列 |
2、阻塞队列的好处
在多线程领域,所谓阻塞,在某些情况下会挂起线程(即阻塞),一旦条件满足会被自动唤醒。
为什么需要BlockingQueue?
好处是我们不需要关心什么时候需要阻塞线程,是什么时候需要唤醒线程,因为这一切BlockingQueue都包办了。
在concurrent包发布之前,多线程下,我们每个程序员需要自己控制这些细节,尤其还需要兼顾效率和线程安全,而这会给程序带来不小的复杂度
3、BlockingQueue的核心方法
方法类型 | 抛出异常 | 特殊值 | 阻塞 | 超时 |
---|---|---|---|---|
插入 | add(e) | offer(e) | put(e) | offer(e, time, unit) |
移除 | remove(e) | poll() | take() | poll(time, unit) |
检查 | element() | peek() | - | - |
特性 | 满 | 空 |
---|---|---|
抛出异常 | add会IllegalStateException: Queue full | remove会NoSuchElementException element会NoSuchElementException |
特殊值 | offer会false | poll、peek会null |
一直阻塞 | put死等 | take死等 |
超时退出 | offer有限等待 | poll有限等待 |
4、源码
import java.util.Collection; |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 月怿姝雪颜!
评论
Disquslivere