1. 简介

阻塞队列顾名思义本质上是一个先进先出的队列,不过阻塞队列是一个并发的容器,是线程安全的,并且在提供常用的队列获取方法之外还提供了阻塞与超时方法。

2. 实现

Queue接口

现在来回顾一下队列接口Queue,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public interface Queue<E> extends Collection<E> {
//添加元素,成功返回true,失败抛出异常java.lang.IllegalStateException: Queue full
boolean add(E e);
//添加元素,成功返回true,失败返回false
boolean offer(E e);
//移除队头元素,成功返回移除元素值,失败抛出异常java.util.NoSuchElementException
E remove();
//移除队头元素,成功返回移除元素值,失败返回null
E poll();
//获取队头元素,没有抛出异常java.util.NoSuchElementException
E element();
//获取队头元素,没有返回null
E peek();
}

BlockingQueue接口

BlockingQueue接口则在Queue的基础上增加了阻塞方法和超时方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public interface BlockingQueue<E> extends Queue<E> {
boolean add(E e);
boolean offer(E e);
//添加元素,如队列已满则一直阻塞直到添加成功返回,该方法可在阻塞过程中响应中断
void put(E e) throws InterruptedException;
//添加元素,如队列已满则一直阻塞直到添加成功或超时返回,该方法可在阻塞过程中响应中断
boolean offer(E e, long timeout, TimeUnit unit) throws InterruptedException;
//移除队头元素,如队列为空则一直阻塞直到队列不为空,该方法可在阻塞过程中响应中断
E take() throws InterruptedException;
//移除队头元素,如队列为空则一直阻塞直到移除成功或超时返回,该方法可在阻塞过程中响应中断
E poll(long timeout, TimeUnit unit) throws InterruptedException;
int remainingCapacity();
boolean remove(Object o);
public boolean contains(Object o);
//一次性从BlockingQueue获取所有可用的元素存储在集合c中
int drainTo(Collection<? super E> c);
int drainTo(Collection<? super E> c, int maxElements);
}

BlockingQueue的实现类

BlockingQueue的实现
BlockingQueue的实现

如上图所示,阻塞队列有7个实现:

  • ArrayBlockingQueue :一个由数组实现的有界阻塞队列。
  • LinkedBlockingQueue :一个由链表实现的有界阻塞队列。
  • PriorityBlockingQueue :一个支持优先级排序的无界阻塞队列。
  • DelayQueue:一个由优先级队列实现的无界延时阻塞队列。
  • SynchronousQueue:同步队列,一个不存储元素的阻塞队列。
  • LinkedTransferQueue:一个由链表实现的无界阻塞队列,具有transfer相关方法。
  • LinkedBlockingDeque:一个由链表实现的双端阻塞队列。