Queue 和 BlockingQueue 都是在 Java 5 中加入的。
一、Queue接口


public interface Queue<E> extends Collection<E> {//添加一个元素,添加成功返回true, 如果队列满了,就会抛出异常boolean add(E e);//添加一个元素,添加成功返回true, 如果队列满了,返回falseboolean offer(E e);//返回并删除队首元素,队列为空则抛出异常E remove();//返回并删除队首元素,队列为空则返回nullE poll();//返回队首元素,但不移除,队列为空则抛出异常E element();//获取队首元素,但不移除,队列为空则返回nullE 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 | 基于链表结构实现的一个双端阻塞队列 |
三、Dueue(双端)


