BlockingQueue

7次阅读

共计 930 个字符,预计需要花费 3 分钟才能阅读完成。

BlockingQueue<E>

工作队列 BlockingQueue<E> 其子类

ArrayBlockingQueue 数组型阻塞队列
LinkedBlockingQueue 链表型阻塞队列
DelayQueue 延时队列
SynchronousQueue 同步队列
PriorityBlockingQueue 优先阻塞队列

ArrayBlockingQueue

public ArrayBlockingQueue(int capacity)
public ArrayBlockingQueue(int capacity, boolean fair)
基于数组的、有界的、遵循 FIFO 原则的阻塞队列
初始化时必须指定队列大小
入队和出队共用同一个可重入锁,互斥,无法同时入队出队
有界设计,容量已满则无法继续添加元素直至有元素被移除
内存连续片段,在 remove 时需要移动数据,影响性能

LinkedBlockingQueue

基于链表的、有界的、遵循 FIFO 原则的阻塞队
puts 操作都会生成新的 Node 对象,takes 操作 Node 对象在某一时间会被 GC,可能会影响 GC 性能
可设定边界,在默认构造方法中容量是 Integer.MAX_VALUE
node 包含 next 节点关联,会多占用一点内存
两个重入锁(非公平锁)分别控制元素出队入队,在高并发高吞吐的情况下,性能较好,用 Condition 进行线程间的唤醒和等待
非连续性内存空间,执行 remove 操作时,不用移动其他数据

DelayQueue

无边界设计
添加(put)不阻塞,移除(take)阻塞
元素都有一个过期时间,取元素时只有过期的才会被取出

SynchronousQueue

内部容量是 0
每次删除操作都要等待插入操作
每次插入操作都要等待删除操作
一个元素,一旦有了插入线程和移除线程,那么很快由插入线程移交给移除线程,这个容器相当于通道,本身不存储元素
在多任务队列,是最快的处理任务方式。

PriorityBlockingQueue

无边界设计,但容量实际是依靠系统资源影响
添加元素,如果超过 1,则进入优先级排序

参考资料《ArrayBlockingQueue》
参考资料《Java 并发编程 — LinkedBlockingQueue 与 ArrayBlockingQueue(七)》

正文完
 0