Queue 和 BlockingQueue 都是在 Java 5 中加入的。
一、Queue接口
public interface Queue<E> extends Collection<E> {
//添加一个元素,添加成功返回true, 如果队列满了,就会抛出异常
boolean add(E e);
//添加一个元素,添加成功返回true, 如果队列满了,返回false
boolean offer(E e);
//返回并删除队首元素,队列为空则抛出异常
E remove();
//返回并删除队首元素,队列为空则返回null
E poll();
//返回队首元素,但不移除,队列为空则抛出异常
E element();
//获取队首元素,但不移除,队列为空则返回null
E peek();
二、BlockingQueue接口
阻塞队列(BlockingQueue)是一个在队列基础上又支持阻塞的队列。
- 支持阻塞的插入方法put: 队列满时,队列会阻塞插入元素的线程,直到队列不满。
- 支持阻塞的移除方法take: 队列空时,获取元素的线程会等待队列变为非空
入队
(1)offer(E e):如果队列没满,返回true,如果队列已满,返回false(不阻塞)
(2)offer(E e, long timeout, TimeUnit unit):可以设置阻塞时间,如果队列已满,则进行阻塞。超过阻塞时间,则返回false
(3)put(E e):队列没满的时候是正常的插入,如果队列已满,则阻塞,直至队列空出位置出队
(1)poll():如果有数据,出队,如果没有数据,返回null (不阻塞)
(2)poll(long timeout, TimeUnit unit):可以设置阻塞时间,如果没有数据,则阻塞,超过阻塞时间,则返回null
(3)take():队列里有数据会正常取出数据并删除;但是如果队列里无数据,则阻塞,直到队列里有数据。BlockingQueue常用方法总结
| 方法 | 抛出异常 | 返回特定值 | 阻塞 | 阻塞特定时间 | | —- | —- | —- | —- | —- | | 入队 | add(e) | offer(e) | put(e) | offer(e, time, unit) | | 出队 | remove() | poll() | take() | poll(time, unit) | | 获取队首元素 | element() | peek() | 不支持 | 不支持 |
常见阻塞队列
BlockingQueue 接口的实现类都在 juc 包中,它们的区别主要体现在存储结构上或对元素操作上的不同,但是对于take与put操作的原理,却是类似的。
队列 | 描述 |
---|---|
ArrayBlockingQueue | 基于数组结构实现的一个有界阻塞队列 |
LinkedBlockingQueue | 基于链表结构实现的一个有界阻塞队列 |
PriorityBlockingQueue | 支持按优先级排序的无界阻塞队列 |
DelayQueue | 基于优先级队列(PriorityBlockingQueue)实现的无界阻塞队列 |
SynchronousQueue | 不存储元素的阻塞队列 |
LinkedTransferQueue | 基于链表结构实现的一个无界阻塞队列 |
LinkedBlockingDeque | 基于链表结构实现的一个双端阻塞队列 |