千家信息网

Java并发队列BlockingQueue怎么用

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章主要介绍了Java并发队列BlockingQueue怎么用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java并发队列BlockingQueue怎么用文章都会有
千家信息网最后更新 2026年11月03日Java并发队列BlockingQueue怎么用

这篇文章主要介绍了Java并发队列BlockingQueue怎么用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java并发队列BlockingQueue怎么用文章都会有所收获,下面我们一起来看看吧。

BlockingQueue

首先,最基本的来说, BlockingQueue 是一个先进先出的队列(Queue),为什么说是阻塞(Blocking)的呢?是因为 BlockingQueue 支持当获取队列元素但是队列为空时,会阻塞等待队列中有元素再返回;也支持添加元素时,如果队列已满,那么等到队列可以放入新元素时再放入。

BlockingQueue 是一个接口,继承自 Queue,所以其实现类也可以作为 Queue 的实现来使用,而 Queue 又继承自 Collection 接口。

BlockingQueue 对插入操作、移除操作、获取元素操作提供了四种不同的方法用于不同的场景中使用:1、抛出异常;2、返回特殊值(null 或 true/false,取决于具体的操作);3、阻塞等待此操作,直到这个操作成功;4、阻塞等待此操作,直到成功或者超时指定时间。总结如下:


Throws exception

Special value

Blocks

Times out

Insertadd(e)offer(e)put(e)offer(e, time, unit)
Removeremove()poll()take()poll(time, unit)
Examineelement()peek()

not applicable

not applicable

BlockingQueue 的各个实现都遵循了这些规则,当然我们也不用死记这个表格,知道有这么回事,然后写代码的时候根据自己的需要去看方法的注释来选取合适的方法即可。

对于 BlockingQueue,我们的关注点应该在 put(e) 和 take() 这两个方法,因为这两个方法是带阻塞的。

BlockingQueue 不接受 null 值的插入,相应的方法在碰到 null 的插入时会抛出 NullPointerException 异常。null 值在这里通常用于作为特殊值返回(表格中的第三列),代表 poll 失败。所以,如果允许插入 null 值的话,那获取的时候,就不能很好地用 null 来判断到底是代表失败,还是获取的值就是 null 值。

一个 BlockingQueue 可能是有界的,如果在插入的时候,发现队列满了,那么 put 操作将会阻塞。通常,在这里我们说的无界队列也不是说真正的无界,而是它的容量是 Integer.MAX_VALUE(21亿多)。

BlockingQueue 是设计用来实现生产者-消费者队列的,当然,你也可以将它当做普通的 Collection 来用,前面说了,它实现了 java.util.Collection 接口。例如,我们可以用 remove(x) 来删除任意一个元素,但是,这类操作通常并不高效,所以尽量只在少数的场合使用,比如一条消息已经入队,但是需要做取消操作的时候。

BlockingQueue 的实现都是线程安全的,但是批量的集合操作如 addAll, containsAll, retainAll 和 removeAll 不一定是原子操作。如 addAll(c) 有可能在添加了一些元素后中途抛出异常,此时 BlockingQueue 中已经添加了部分元素,这个是允许的,取决于具体的实现。

BlockingQueue 不支持 close 或 shutdown 等关闭操作,因为开发者可能希望不会有新的元素添加进去,此特性取决于具体的实现,不做强制约束。

最后,BlockingQueue 在生产者-消费者的场景中,是支持多消费者和多生产者的,说的其实就是线程安全问题。

相信上面说的每一句都很清楚了,BlockingQueue 是一个比较简单的线程安全容器,下面我会分析其具体的在 JDK 中的实现,这里又到了 Doug Lea 表演时间了。

BlockingQueue 实现之 ArrayBlockingQueue

ArrayBlockingQueue 是 BlockingQueue 接口的有界队列实现类,底层采用数组来实现。

其并发控制采用可重入锁来控制,不管是插入操作还是读取操作,都需要获取到锁才能进行操作。

ArrayBlockingQueue 共有以下几个属性:

// 用于存放元素的数组final Object[] items;// 下一次读取操作的位置int takeIndex;// 下一次写入操作的位置int putIndex;// 队列中的元素数量int count;// 以下几个就是控制并发用的同步器final ReentrantLock lock;private final Condition notEmpty;private final Condition notFull;

我们用个示意图来描述其同步机制:

好了, PriorityBlockingQueue 我们也说完了。

关于"Java并发队列BlockingQueue怎么用"这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对"Java并发队列BlockingQueue怎么用"知识都有一定的了解,大家如果还想学习更多知识,欢迎关注行业资讯频道。

队列 元素 方法 阻塞 接口 时候 支持 安全 取决于 就是 消费者 知识 线程 控制 消费 不同 特殊 成功 两个 产者 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技网 山东特亿宝互联网科技有限公司 无线互联网科技 米客互联网科技 互联网科技的未来发展 天扬科技互联网广告 互联网科技创新企业排名 广州优美互联网科技 互联网科技教育视频 厦门比较好的科技互联网公司 和信科技工业互联网 互联网科技产业特征 开一家科技互联网公司需要多少钱 如何创新互联网科技 沐思想互联网科技有限公司 山东大美朱楼互联网科技有限公司 保山互联网科技靠谱吗 科技互联网专业工作会议发言稿 陕西彩京云互联网科技有限公司 互联网领先科技成果宣传视频 广东万易互联网科技有限公司惠州分公司 广州淘业互联网络科技 睿民互联网科技 成都仁贤领冠互联网科技有限公司 互联网科技博主是什么意思 来此购互联网科技有限公司 上海宁丞科技互联网 知域互联网科技有限公司大骗子 电子科技大学互联网创业大赛 广西泛欧互联网科技有限公司
0