您的位置:首页 > 产品设计 > UI/UE

阻塞队列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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: