> For the complete documentation index, see [llms.txt](https://yibingxiong.gitbook.io/java-concurrent-programming-art-mini/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://yibingxiong.gitbook.io/java-concurrent-programming-art-mini/di-05-zhang-zu-sai-dui-lie/01-zu-sai-dui-lie-de-tong-yong-cao-zuo.md).

# 01-阻塞队列的通用操作

阻塞队列都是实现BlockingQueue接口的，因此他们方法都是一样的

## API和不可用的处理方式

当阻塞队列不可用时（向满的队列插入，从空队列取数据），提供了四种处理方式

| 方法 | 抛出异常             | 返回特殊值              | 一直阻塞                                      | 超时退出                                                                        |
| -- | ---------------- | ------------------ | ----------------------------------------- | --------------------------------------------------------------------------- |
| 插入 | boolean add(E e) | boolean offer(E e) | void put(E e) throws InterruptedException | boolean offer(E e, long timeout, TimeUnit unit) throws InterruptedException |
| 移除 | void remove()    | poll()             | E take() throws InterruptedException      | E poll(long timeout, TimeUnit unit) throws InterruptedException             |
| 查看 | element()        | peek()             | 不可用                                       | 不可用                                                                         |

### 抛出异常

* 满了继续插入会抛出：IllegalStateException （"Queue full"）
* 空了继续出队会抛出：NoSuchElementException

### 返回特殊值

* 满了继续插入会返回false
* 空了继续出队会返回null

### 一直阻塞

* 满了继续插入会阻塞，直到有空位或被中断
* 空了继续出队会阻塞，直到有元素或被中断

### 超时退出

也是会阻塞，但是达到一定时间还没成功就返回特殊值了
