Java并发编程学习六:阻塞队列
一、阻塞队列
1. 简介
阻塞队列,即BlockingQueue,它是一个接口,继承自Queue 接口,是队列的一种。Queue 和 BlockingQueue 都是在 Java 5 中加入的。
public interface BlockingQueue<E> extends Queue<E>{
...}
阻塞队列是线程安全的,典型的应用场景是在生产者/消费者模式中,用于存储数据,保证再多线程下的正确运行。

除了BlockingQueue,Queue接口的实现类和子类还有很多,如下图所示:

上述实现类和子类中,除了Deque都是线程安全的,而这些线程安全的队列可以分为阻塞队列和非阻塞队列两大类。
阻塞队列就是BlockingQueue 接口的实现类,主要有6种:ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue、DelayQueue、PriorityBlockingQueue 和 LinkedTransferQueue。
非阻塞队列就是ConcurrentLinkedQueue,这个类不会让线程阻塞,利用 CAS 保证了线程安全。
而Deque 是一个双端队列,从头和尾都能添加和删除元素;而普通的 Queue 只能从一端进入,另一端出去。
2. BlockingQueue的常见方法
BlockingQueue中和添加、删除相关的方法有8个,它们的区别仅在于特殊情况:当队列满了无法添加元素,或者是队列空了无法移除元素时,不同组的方法对于这种特殊情况会有不同的处理方式:
- 抛出异常:add、remove、element
- 返回结果但不抛出异常:offer、poll、peek
- 阻塞:put、take