队列Queue-04
【摘要】 1.BlockingQueue 接口定义阻塞队列:BlockQueue 满了,PUT 操作被阻塞BlockQueue 为空,Take 操作被阻塞阻塞队列为空的情况:BlockingQueue(阻塞队列)也是一种队列,支持阻塞的插入和移除方法。阻塞的插入:当队列满时,队列会阻塞插入元素的线程,直到队列不满。阻塞的移除:当队列为空,获取元素的线程会等待队列变为非空。应用场景:生产者和消费者,生...
1.BlockingQueue 接口定义
阻塞队列:
- BlockQueue 满了,PUT 操作被阻塞
- BlockQueue 为空,Take 操作被阻塞
阻塞队列为空的情况:
- BlockingQueue(阻塞队列)也是一种队列,支持阻塞的插入和移除方法。
- 阻塞的插入:当队列满时,队列会阻塞插入元素的线程,直到队列不满。
- 阻塞的移除:当队列为空,获取元素的线程会等待队列变为非空。
- 应用场景:生产者和消费者,生产者线程向队列里添加元素,消费者线程从队列里移除元素,阻塞队列时获取和存放元素的容器。
- 为什么要用阻塞队列:生产者生产和消费者消费的速率不一样,需要用队列来解决速率差问题,当队列满了或空的时候,则需要阻塞生产或消费动作来解决队列满或空的问题。
2.BlockingQueue 核心方法
BlockingQueue 接口的 10 个核心方法:
3.十个核心方法总结如下
BlockingQueue接口的10个核心方法:
有三大类操作:插入、移除、检查。
- 插入有四种方法: add、offer、put、offer 超时版。
-
IllegalStateException
- 队列满了ClassCastException
- 添加的元素类型不匹配NullPointerException
- 添加的元素为 nullIllegalArgumentException
- 添加的元素某些属性不匹配- add 方法特别之处用于添加失败时抛出异常,共有四种异常:
- offer 方法特别之处用于添加失败时只返回 false
- put 方法特别之处用于当阻塞队列满时,生产者如果往队列里 put 元素,则队列会一直阻塞生产者线程,直到队列可用或者响应中断退出
- offer 超时方法特别之处用于当阻塞队列满时,生产者如果往队列里面插入元素,队列会阻塞生产者线程一段时间,如果超过了指定时间,生产者线程会退出,并返回 false。
- 移除有四种方法: remove、poll、take、poll 超时版
-
NoSuchElementException
- 如果这个队列是空的- remove 方法特别之处用于移除失败时抛出异常
- poll 方法特别之处用于移除失败时返回 null
- take 方法特别之处用于当阻塞队列为空时,消费者线程如果从队列里面移除元素,则队列会一直阻塞消费者线程,直到队列不为空
- poll 超时方法特别之处用于当阻塞队列空时,消费者如果从队列里面删除元素,则队列会一直阻塞消费者线程,如果超过了指定时间,消费者线程会退出,并返回 null
- 检查有两种方法: element、peek
-
- element 方法用于检测头部元素的存在性,如果队列为空,则抛出异常,否则返回头部元素。
- peek 方法用于检测头部元素的存在性,如果队列为空,返回特殊值 null,否则返回头部的元素。
4.BlockingQueue 原理
BlockingQueue 通过什么来阻塞插入和移除的?
-
当往队列里插入一个元素时,如果队列不可用,那么阻塞生产者主要通过 LockSupport. park(this)来实现。
-
park 这个方法会阻塞当前线程,只有以下 4 种情况中的一种发生时,该方法才会返回。
-
与 park 对应的 unpark 执行或已经执行时。“已经执行”是指 unpark 先执行,然后再执行 park 的情况。
-
线程被中断时。
-
等待完 time 参数指定的毫秒数时。
-
异常现象发生时,这个异常现象没有任何原因。
-
5.BlockingQueue 继承与实现
哪些类继承了BlockingQueue接口:
- BlockingDeque 接口 - 双端阻塞队列
- TransferQueue 接口 - 传输队列
哪些类实现了BlockingQueue接口:
- ArrayBlockingQueue 类 - 由数组构成的有界阻塞队列
- LinkedBlockingQueue 类 - 由链表构成的有界阻塞队列,界限默认大小为 Integer.MAX_Value(2^31-1),值非常大,相当于无界。
- LinkedBlockingDeque 类 - 由链表构成的双向阻塞队列
- LinkedTransferQueue 类 - 由链表构成的无界阻塞队列
- SynchronousQueue 类 - 不存储元素的阻塞队列,只有一个元素进行数据传递。
- LinkedTransferQueue 类 - 由链表构成的无界阻塞 TransferQueue 队列
- DelayQueue 类 - 使用优先级队列实现的延迟无界阻塞队列
6.BlockingDeque 接口方法
是阻塞队列BlockingQueue
和双向队列Deque
接口的结合。有如下方法:
BlockingQueue和BlockingDeque的对等方法:
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)