PriorityBlockingQueue 的put方法底层源码

news/2025/2/21 15:42:58/文章来源:https://www.cnblogs.com/jock766/p/18725308

一、PriorityBlockingQueue 的put方法底层源码

PriorityBlockingQueue 的 put 方法用于将元素插入队列。由于 PriorityBlockingQueue 是一个无界队列,put 方法不会阻塞,总是会成功插入元素


1、put 方法的作用

  • 将元素插入队列。

  • 由于队列无界,put 方法不会阻塞,总是会成功插入元素。

  • 插入后,队列会根据元素的优先级重新排序。


2、put 方法的源码

以下是 PriorityBlockingQueue 中 put 方法的源码(基于 JDK 17):

可以看到,put 方法直接调用了 offer 方法。因此,我们需要进一步分析 offer 方法的实现。


3、offer 方法的源码

以下是 PriorityBlockingQueue 中 offer 方法的源码:


4、源码解析


(1)参数检查

  • PriorityBlockingQueue 不允许插入 null 元素,如果传入 null,会抛出 NullPointerException。


(2)获取锁

  • lock 是 PriorityBlockingQueue 的成员变量,用于控制插入和移除操作的并发访问。

  • 调用 lock() 方法获取锁。


(3)检查队列容量

  • size 是当前队列中的元素数量。

  • 如果队列已满(n >= queue.length),调用 grow() 方法扩容。

  • grow() 方法的实现:


(4)插入元素并调整堆结构

  • siftUp 方法将元素插入堆中,并调整堆结构以维持堆的性质:

siftUp 方法通过比较元素和其父节点,将元素插入到正确的位置,以维持堆的性质(最小堆或最大堆)


(5)更新队列大小

  • 将队列大小加 1。


(6)唤醒消费者线程

  • 如果队列之前为空,调用 notEmpty.signal() 唤醒可能正在等待的消费者线程。


(7)释放锁

  • 在 finally 块中释放锁,确保锁一定会被释放,避免死锁。


(8)返回结果

  • 由于队列无界,offer 方法总是返回 true。


二、关键点总结

  • 无界队列:PriorityBlockingQueue 是无界队列,put 方法不会阻塞。

  • 堆结构:使用堆数据结构维护元素的优先级顺序。

  • 线程安全:通过 ReentrantLock 保证线程安全。

  • 动态扩容:当队列容量不足时,会自动扩容。


三、示例流程图

以下是 put 方法的执行流程图:


1、检查元素是否为 null。


2、获取锁。


3、检查队列容量,如果不足则扩容。


4、将元素插入堆中,并调整堆结构。


5、更新队列大小。


6、如果队列之前为空,唤醒消费者线程。


7、释放锁。


8、返回 true。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/886911.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度剖析多任务模型 QAT 策略

本文为笔者个人见解,如有不同意见欢迎评论1.引言 为了节省端侧计算资源以及简化部署工作,目前智驾方案中多采用动静态任务融合网络,地平线也释放了 Lidar-Camera 融合多任务 BEVFusion 参考算法。这种多任务融合网络的浮点训练策略可以简述为: 首先在大量数据的条件下完成多…

猫步简历 - 开源免费AI简历生成器 | 一键导出PDF/JSON

猫步简历是一款免费开源的AI简历生成与制作神器,旨在帮助求职者轻松创建独特、优美且专业的简历。无论是应届毕业生、职场新人,还是资深专业人士,猫步简历都能满足您的需求。它支持导出超高清PDF、图片、源码级JSON数据等多种格式,并提供AI智能创作、AI语种切换、AI润色等强…

老年人能力评估uni-app

登录界面 (https://img2024.cnblogs.com/blog/3474174/202502/3474174-20250219211712486-62129844.png) 老年人信息界面添加老年人信息界面这个不知道哪里写错了,选择器的选项看不到。我本来想和web端一样,用弹出对话框来添加老年人信息的,结果整了半天,对话框弹不出来,然…

ICLR 2025 时间序列

1. TimeMixer++: A General Time Series Pattern Machine for Universal Predictive Analysis 链接:https://openreview.net/forum?id=1CLzLXSFNn 关键词:多任务(预测,分类,插补,异常检测)、基础模型 TL;DR:TimeMixer++ 是一种时间序列模式机器,它采用多尺度和多分辨…

用于 Qt 的 OpenCV 编译 (CMake 方式) 问题解决

本文主要参考 《QT+opencv源码编译》:https://blog.csdn.net/m0_49156395/article/details/135721596 详细步骤请阅读上面文章,本文主要着重强调其中的关键步骤。 一、Configure(CMakeList.txt)和 generate(Makefile) 过程(11)先进行初次Configure "Where to build th…

【硬件测试】基于FPGA的2ASK调制解调系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR

1.算法仿真效果 本文是之前写的文章基于FPGA的2ASK调制解调系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR的硬件测试版本。在系统在仿真版本基础上增加了ila在线数据采集模块,vio在线SNR设置模块,数据源模块。硬件ila测试结果如下:(完整代码运行后无水印…

即将迎来全民编程时代

最近,我的这种情绪现在越来越强烈了。 还记得我刚开始使用AI辅助编程的时候,写出来的代码能运行就不错了,还别想着要他理解需求和修改bug了。直到2024年年底到2025年年初这短短两个多月的时间,我对它的想法变成了,它是我们的编程搭子,甚至可以说是免费劳动力了。 再试编程…

.net8:拦截器Interceptors

在C#12中,引入了拦截器,但一直是试验性的功能,所以自己初步看了一下,没有写文章,最近在看AOT时,发现Dapper.AOT已经用上了这个功能,觉得还是整理一下,分享出来吧,如果以后这个功能改变了,或移除了,请无视这篇文章。下面是微软官方文档的提示:拦截器是一项试验性功能…

基于电压矢量变换的锁相环simulink建模与仿真

1.课题概述 基于电压矢量变换的锁相环simulink建模与仿真,这个模型的基本构架如下所示:2.系统仿真结果由图中锁相结果可以看出,利用新型锁相环技术在电网电压平衡条件和不平衡条件下均可对基波正序电压分量实现快速准确的锁相输出。这将在后面研究系统 电压不平衡环境下负序…

Spatial Data Analysis简易教程

1. 因子的多重共线性 (1)Perason相关系数(不推荐) SPSS-分析-》相关-》双变量-》确定,选择相关系数较小的因子:但是在分析-》回归-》线性中共线性诊断中,仍有3个变量的VIF>10,因此,该方法不可取。(2)共线性诊断 分析-》回归-》线性,在选项中勾选共线性诊断,方法…

基于线性核函数的SVM数据分类算法matlab仿真

1.程序功能描述 基于线性核函数的SVM数据分类算法matlab仿真,通过程序产生随机的二维数据,然后通过SVM对数据进行分类,SVM通过编程实现,不使用MATLAB自带的工具箱函数。 2.测试软件版本以及运行结果展示MATLAB2022A版本运行 (完整程序运行后无水印) 3.核心程序 % …

服务器 压测cpu

一. 使用的工具 1. taskset简单理解为: -c 找 cpu核心 -p 找 已存在进程2. stress 二 . 查看cpu核心个数 ,命令 lscpu 三. 使用taskset 与 yes 命令简单测试,htop查看cpu使用率 1. 测试第一个cpu核心 taskset -c 0 yes >> 1.txt 2. 测试第二个cpu核心taskset -c 1 y…