线程池动态设置线程大小踩坑

在配置线程池核心线程数大小和最大线程数大小后,如果调用线程池setCorePoolSize方法来调整线程池中核心线程的大小,需要特别注意,可能踩坑,说不定增加了线程让你的程序性能更差。

ThreadPoolExecutor有提供一个动态变更线程池核心线程数大小的方法setCorePoolSize,如果我们使用次方法来改变线程池的线程数确实可以实现想要的效果,但是会有一些意想不到的结果。比如,出现下图的情况。

先简单介绍一下背景,我先创建了一个核心线程数和最大线程数都为1的线程池,然后通过ThreadPoolExecutor.setCorePoolSize()方法设置核心线程数为5,接着继续往线程池中丢任务,我看通过截图可以看到,这些线程在执行完一次任务后就直接销毁了,并不是想像中的执行完一个任务后持续的执行队列中的任务或者是阻塞等待新任务的到来。如果一直持续这样,系统的性能其实是会更差的,因为一直在创建线程销毁线程。

但是,如果我是创建一个核心线程数和最大线程数都为5的线程池,然后通过ThreadPoolExecutor.setCorePoolSize()方法设置核心线程数为1或者2。如果我持续往里面丢任务,核心线程数也是保持在我设定的值。

小结

如果此时是将线程数调小没有任何问题,线程在处理完任务以及队列中的任务后会阻塞在队首等待任务到来被唤醒。

如果此时是将线程数调大就需要注意,当有任务到来时,如果当前核心线程数小于配置的,则会创建新的线程,但是它执行完一次任务后就会被销毁,即使队列中还有任务等待执行,他也会立马被销毁。

问题排查

出现问题第一反应就是线程在执行完当前任务后,获取任务的时候出了问题,于是在java.util.concurrent.ThreadPoolExecutor#getTask方法中获取队列任务的地方打断点排查是否是获取任务出现问题。初步怀疑是这里timed判断有问题导致的,结果断点都没有到这里。

boolean timed = allowCoreThreadTimeOut || wc > corePoolSize;if ((wc > maximumPoolSize || (timed && timedOut))&& (wc > 1 || workQueue.isEmpty())) {if (compareAndDecrementWorkerCount(c))return null;continue;
}try {Runnable r = timed ?workQueue.poll(keepAliveTime, TimeUnit.NANOSECONDS) :workQueue.take();if (r != null)return r;timedOut = true;
} catch (InterruptedException retry) {timedOut = false;
}

以为是别的地方有问题,转了一圈回来还是怀疑这个方法,最后仔细看了一遍,发现了问题所在。

出现以上问题的根本原因就是我们只动态修改了核心线程数大小,未同步修改最大线程数大小。每一次任务执行完成后需要调用java.util.concurrent.ThreadPoolExecutor#getTask方法,其中有一段下面的逻辑。由于我们只调整了核心线程数,未同步修改最大线程数,这里就会走到returen null的逻辑,就会退出当前线程。

if ((wc > maximumPoolSize || (timed && timedOut))&& (wc > 1 || workQueue.isEmpty())) {if (compareAndDecrementWorkerCount(c))return null;continue;
}

总结

在动态修改线程的核心线程数后也需要同步修改最大线程数,否则会导致线程创建后执行一个任务后就被销毁。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

linux中vim编辑器的应用实例

前言 Linux有大量的配置文件,其中编辑一些配置文件,最常用的工具就是 Vim ,本文介绍一个实际应用的Vim编辑器开发文档的实例。 Vim是一个类似于Vi的著名的功能强大、高度可定制的文本编辑器,在Vi的基础上改进和增加了很多特性。…

单片机原理及应用详解

目录 1. 什么是单片机? 2. 单片机的基本组成 3. 单片机的工作原理 4. 常见的单片机分类 5. 单片机的应用领域 6. 单片机开发流程 7. 单片机开发中的常见问题及解决方案 8. 单片机的未来发展趋势 9. 总结 1. 什么是单片机? 单片机(Mi…

solidwork中圆角的快捷操作

第一步 第二步: 选择一条边 快捷选择多个边,就不用一个个去点

代码随想录算法day37 | 动态规划算法part10 | 300.最长递增子序列,674. 最长连续递增序列,718. 最长重复子数组

今天开始正式子序列系列!!!!! 300.最长递增子序列 本题是比较简单的,感受感受一下子序列题目的思路。 力扣题目链接(opens new window) 给你一个整数数组 nums ,找到其中最长严格递增子序列的长…

视频怎么剪切掉一部分?6款视频剪切软件,零基础也能快速学会!

您是否也曾遇到了这样的一个问题:在录制完视频之后,发现视频中存在一些多余或者不想要的片段,想要将它剪切掉却不知道具体要怎么操作?别担心,几乎所有视频都会需要这样的调整才能更加出色。如果您是刚入门的视频剪辑初…

排序算法的分析和应用

自己设计一个长度不小于10的乱序数组,用希尔排序,自己设定希尔排序参数 画出每一轮希尔排序的状态 自己设计一个长度不小于10的乱序数组,用堆排序,最终要生成升序数组,画出建堆后的状态 画出每一轮堆排序的状态 自…

9.20日学习记录及相关问题解答

部分一 今天看了一本古老的书。学到了一些有关计算机的远古的知识。弥补了一些之前没有意识到的空白点。 原来上个世纪就有AI这个东西了 现阶段的主流模式,在许多年前其实是将来要发展的对象。 B/S指的是客户机/服务器结构模式 C/S是在B/S基础上发展过来的。三层结…

9月16日笔记

访问控制列表 访问控制列表(ACL)是访问控制项(Access Control Entry , ACE)的列表。安全对象的安全描述可以通过两种访问控制列表DACL和SACL进行。 DACL DACL 是由一条条的访问控制项(ACE)条目构成的,每条ACE定义了哪些用户或组对该对象拥有怎样的访问权限。DACL…

DeepCross模型实现推荐算法

1. 项目简介 A032-DeepCross项目是一个基于深度学习的推荐算法实现,旨在解决个性化推荐问题。随着互联网平台上信息和内容的爆炸式增长,用户面临着信息过载的困境,如何为用户提供高效、精准的推荐成为了关键。该项目背景基于现代推荐系统的发…

数仓规范:命名规范如何设计?

目录 0 前言 1 表命名规范 2 字段命名规范 3 任务命名规范 4 层级命名规范 5 自定义函数命名规范 6 视图和存储过程的命名规范 7 综合案例分析 8 常见陷阱和如何避免 9 工具和最佳实践 10 小结 想进一步了解数仓建设这门艺术的,可以订阅我的专栏数字化建设…

笔尖划出秋季的声息

笔尖划出秋季的声息 进入秋分,天气渐趋凉爽,天空青蓝明朗,难言伤感。 九月,把一些句子记录好,明年拿出来晒一晒,秋季也就有了答案。 1、经历 9月6日,台风“摩羯”席卷而过粤西,…

[Excel VBA]如何使用VBA按行拆分Excel工作表

如何使用VBA按行拆分Excel工作表 在Excel中,按行拆分工作表并生成多个新工作表是一项实用的技能,尤其在处理大量数据时。以下是一个VBA代码示例,能帮助你轻松实现这一功能。 1. 代码说明 本代码会根据源工作表中每个姓名创建一个新工作表&a…

mybatis 配置文件完成增删改查(二):根据条件查询一个

文章目录 参数占位符#{}:会将其替换为? ——为了防止sql注入${}:会将其替换为实际接收到的数据,拼sql ——无法防止sql注入 查询一个sql特殊字符的处理 参数占位符 #{}:会将其替换为? ——为了防止sql注入 ${}:会将其替换为实际接收到的数据…

2024年一区极光优化+分解+深度学习!VMD-PLO-Transformer-GRU多变量时间序列光伏功率预测

2024年一区极光优化分解深度学习!VMD-PLO-Transformer-GRU多变量时间序列光伏功率预测 目录 2024年一区极光优化分解深度学习!VMD-PLO-Transformer-GRU多变量时间序列光伏功率预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.中秋献礼&#…

python如何跨文件调用自己定义的函数

当自己定义函数过多时,只有一个python文件时代码会很长,不易理清代码框架,比如下面这段代码,如何隐藏具体函数细节呢?也就是把def函数放到另外一个python文件里步骤如下: 一个python文件代码篇幅过长 imp…

面试中如何回答关于 `RecyclerView` 性能优化的理解和实践经验

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点 在面试中展示对 RecyclerView 性能优化的理解和实践经验,你可以从以下几个方面进行阐述: 1. 理解 RecyclerView 的工作…

Maven-五、属性

Maven 文章目录 Maven前言属性定义properties文件加载pom文件属性总结 前言 使用maven中的属性可以来简化我们的配置工作。 属性定义 在pom文件中可以使用**标签设置属性,属性名自定义,然后可以在使用${属性名}**文件中引用自己定义的属性。 使用属性进行配置&a…

干货 | 2024数智新时代制造业数字化创新实践白皮书(免费下载)

导读:本白皮书将对制造业发展历程、现状、趋势与核心难题做深入解读,并在此基础上提出了相应的制造行业解决方案,结合业内实践成功的客户案例来详析信息化转型的有效方法,以供生产制造行业的从业者参考交流。

【网络安全】依赖混淆漏洞实现RCE

未经许可,不得转载。 文章目录 正文 依赖混淆是一种供应链攻击漏洞,发生在企业的内部依赖包错误地从公共库(如npm)下载,而不是从其私有注册表下载。攻击者可以在公共注册表中上传一个与公司内部包同名的恶意包&#xf…

Java的IO流(二)

目录 Java的IO流(二) 字节缓冲流 基本使用 使用缓冲流复制文件 字符缓冲流 缓冲流读取数据原理 字符编码 字符集 转换流 序列化流与反序列化流 基本使用 禁止成员被序列化 序列号不匹配异常 打印流 基本使用 系统打印流与改变流向 Prop…