Queue 和 BlockingQueue 都是在 Java 5 中加入的。

一、Queue接口

image.pngimage.png

  1. public interface Queue<E> extends Collection<E> {
  2. //添加一个元素,添加成功返回true, 如果队列满了,就会抛出异常
  3. boolean add(E e);
  4. //添加一个元素,添加成功返回true, 如果队列满了,返回false
  5. boolean offer(E e);
  6. //返回并删除队首元素,队列为空则抛出异常
  7. E remove();
  8. //返回并删除队首元素,队列为空则返回null
  9. E poll();
  10. //返回队首元素,但不移除,队列为空则抛出异常
  11. E element();
  12. //获取队首元素,但不移除,队列为空则返回null
  13. E peek();

二、BlockingQueue接口

image.pngimage.png
阻塞队列(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(双端)

image.pngimage.png