阻塞队列BlockingQueue
2020-04-30 23:33
871 查看
# 阻塞队列
## 概念
### 队列
队列就可以想成是一个数组,从一头进入,一头出去,排队买饭
### 阻塞队列
BlockingQueue 阻塞队列,排队拥堵,首先它是一个队列,而一个阻塞队列在数据结构中所起的作用大致如下图所示:
![](https://img2020.cnblogs.com/blog/1405595/202004/1405595-20200430231733399-1775925894.png)
线程1往阻塞队列中添加元素,而线程2从阻塞队列中移除元素
- `当阻塞队列是空时,从队列中获取元素的操作将会被阻塞`
- 当蛋糕店的柜子空的时候,无法从柜子里面获取蛋糕
- `当阻塞队列是满时,从队列中添加元素的操作将会被阻塞`
- 当蛋糕店的柜子满的时候,无法继续向柜子里面添加蛋糕了
也就是说 试图从空的阻塞队列中获取元素的线程将会被阻塞,直到其它线程往空的队列插入新的元素
同理,试图往已经满的阻塞队列中添加新元素的线程,直到其它线程往满的队列中移除一个或多个元素,或者完全清空队列后,使队列重新变得空闲起来,并后续新增
## 为什么要用?
去海底捞吃饭,大厅满了,需要进候厅等待,但是这些等待的客户能够对商家带来利润,因此我们非常欢迎他们阻塞
在多线程领域:所谓的阻塞,在某些清空下会挂起线程(即阻塞),一旦条件满足,被挂起的线程又会自动唤醒
### 为什么需要BlockingQueue
好处是我们不需要关心什么时候需要阻塞线程,什么时候需要唤醒线程,因为这一切BlockingQueue都帮你一手包办了
在concurrent包发布以前,在多线程环境下,我们每个程序员都必须自己取控制这些细节,尤其还要兼顾效率和线程安全,而这会给我们的程序带来不小的复杂度。
## 架构
```
// 你用过List集合类
// ArrayList集合类熟悉么?
// 还用过 CopyOnWriteList 和 BlockingQueue
```
BlockingQueue阻塞队列是属于一个接口,底下有七个实现类
- ArrayBlockQueue:由数组结构组成的有界阻塞队列
- LinkedBlockingQueue:由链表结构组成的有界(但是默认大小 Integer.MAX_VALUE)的阻塞队列
- 有界,但是界限非常大,相当于无界,可以当成无界
- PriorityBlockQueue:支持优先级排序的无界阻塞队列
- DelayQueue:使用优先级队列实现的延迟无界阻塞队列
- SynchronousQueue:不存储元素的阻塞队列,也即单个元素的队列
- 生产一个,消费一个,不存储元素,不消费不生产
- LinkedTransferQueue:由链表结构组成的无界阻塞队列
- LinkedBlockingDeque:由链表结构组成的双向阻塞队列
这里需要掌握的是:ArrayBlockQueue、LinkedBlockingQueue、SynchronousQueue
## BlockingQueue核心方法
![](https://img2020.cnblogs.com/blog/1405595/202004/1405595-20200430231912810-1670124647.png)
| 抛出异常 | 当阻塞队列满时:在往队列中add插入元素会抛出 IIIegalStateException:Queue full 当阻塞队列空时:再往队列中remove移除元素,会抛出NoSuchException |
| -------- | ------------------------------------------------------------ |
| 特殊性 | 插入方法,成功true,失败false 移除方法:成功返回出队列元素,队列没有就返回空 |
| 一直阻塞 | 当阻塞队列满时,生产者继续往队列里put元素,队列会一直阻塞生产线程直到put数据or响应中断退出, 当阻塞队列空时,消费者线程试图从队列里take元素,队列会一直阻塞消费者线程直到队列可用。 |
| 超时退出 | 当阻塞队列满时,队里会阻塞生产者线程一定时间,超过限时后生产者线程会退出 |
### 抛出异常组
但执行add方法,向已经满的ArrayBlockingQueue中添加元素时候,会抛出异常
```
// 阻塞队列,需要填入默认值
BlockingQueue
相关文章推荐
- 阻塞队列BlockingQueue
- Java 阻塞队列 BlockingQueue
- BlockingQueue(阻塞队列)详解
- (八) Java多线程详解之阻塞队列BlockingQueue及队列优先级详解
- 阻塞队列(BlockingQueue)
- 阻塞队列 BlockingQueue
- 详解Java阻塞队列(BlockingQueue)的实现原理
- LinkedBlockingQueue阻塞队列offer()操作抛出中断异常
- 阻塞队列BlockingQueue
- BlockingQueue-线程的阻塞队列
- Java多线程____BlockingQueue阻塞队列使用
- JAVA线程池ThreadPoolExecutor与阻塞队列BlockingQueue
- 并发编程 - 阻塞队列BlockingQueue
- 阻塞队列BlockingQueue
- Java常用的2种阻塞队列ArrayBlockingQueue和LinkedBlockingQueue
- java中的阻塞队列BlockingQueue
- java多线程:15、阻塞队列【BlockingQueue】
- 阻塞队列BlockingQueue
- 阻塞队列BlockingQueue(JDK8)
- (java多线程与并发)java并发库中的阻塞队列--BlockingQueue