ThreadPoolExecutor vs 传统线程创建:性能对比实验

快速体验

  1. 打开 InsCode(快马)平台 https://www.inscode.net
  2. 输入框内输入如下内容:
    开发一个线程性能对比测试工具。功能:1. 实现两种任务执行方式:ThreadPoolExecutor和new Thread() 2. 设计可配置的任务负载(CPU/IO密集型) 3. 统计内存占用、创建耗时、任务完成时间 4. 生成对比柱状图 5. 支持不同线程数量的参数化测试。使用Java Microbenchmark框架,输出Markdown格式测试报告。
  3. 点击'项目生成'按钮,等待项目生成完整后预览效果

示例图片

最近在优化一个后台服务时,遇到了多线程处理的性能瓶颈问题。为了更直观地理解线程池和传统线程创建方式的差异,我决定动手做一个性能对比实验。下面分享整个实验的设计思路和测试结果,希望能给有类似需求的开发者一些参考。

实验设计思路

  1. 测试目标设定 明确要对比ThreadPoolExecutor和new Thread()两种方式在相同任务负载下的性能表现,重点关注创建耗时、内存占用和任务完成时间三个关键指标。

  2. 任务类型设计 为了全面评估性能,设计了两种典型的任务类型:

  3. CPU密集型任务:模拟复杂计算
  4. IO密集型任务:模拟网络请求或文件操作

  5. 测试框架选择 使用Java Microbenchmark框架(JMH)进行基准测试,确保测试结果的准确性和可重复性。

  6. 参数化测试 支持配置不同线程数量(4/8/16/32)进行多轮测试,观察线程数量对性能的影响。

实现关键点

  1. 线程池配置 采用ThreadPoolExecutor标准实现,合理设置核心线程数、最大线程数和工作队列容量。特别注意线程工厂和拒绝策略的选择。

  2. 传统线程实现 使用最基本的new Thread()方式创建线程,手动管理线程生命周期,确保每次测试都是全新创建的线程。

  3. 性能指标采集

  4. 使用System.currentTimeMillis()记录创建耗时
  5. 通过Runtime.getRuntime()获取内存使用情况
  6. 使用CountDownLatch同步所有线程完成状态

  7. 数据可视化 将测试结果导出为CSV格式,使用Python matplotlib库生成对比柱状图,直观展示性能差异。

测试结果分析

  1. 创建耗时对比 线程池方式在首次创建时有一定开销,但后续任务执行几乎无创建耗时;而传统方式每次创建新线程都有显著耗时,在高并发场景下尤为明显。

  2. 内存占用对比 线程池通过复用线程显著降低了内存开销,而传统方式随着线程数量增加,内存占用线性增长,32线程时差异可达3-5倍。

  3. 任务完成时间 对于短任务,线程池优势明显;对于长任务,两种方式差距缩小,但线程池仍保持稳定优势。

  4. 线程数量影响 测试发现并非线程数越多越好,合理设置线程池大小对性能优化至关重要。

遇到的问题与解决

  1. 线程泄漏问题 初期测试忘记关闭线程池,导致内存持续增长。通过添加finally块确保资源释放解决了这个问题。

  2. JMH配置优化 默认设置下测试结果波动较大,通过增加预热迭代次数和延长测试时间提升了数据稳定性。

  3. 任务负载均衡 最初设计的IO任务负载过轻,无法体现真实场景差异。调整了模拟IO等待时间后获得了更有参考价值的结果。

实际应用建议

  1. 选择场景
  2. 短期小任务:优先使用线程池
  3. 长期独占任务:可考虑传统方式

  4. 参数调优 根据任务类型(CPU/IO密集型)调整线程池大小,通常IO密集型任务需要更多线程。

  5. 监控与维护 实际应用中应添加线程池监控,动态调整参数以适应不同负载。

这个实验让我对Java线程管理有了更深的理解。整个过程在InsCode(快马)平台上完成非常方便,特别是它的一键部署功能让我能快速验证测试结果,省去了本地搭建环境的麻烦。对于想学习多线程优化的开发者,我强烈建议实际动手做类似的对比实验,会比自己看文档理解得更透彻。

示例图片

快速体验

  1. 打开 InsCode(快马)平台 https://www.inscode.net
  2. 输入框内输入如下内容:
    开发一个线程性能对比测试工具。功能:1. 实现两种任务执行方式:ThreadPoolExecutor和new Thread() 2. 设计可配置的任务负载(CPU/IO密集型) 3. 统计内存占用、创建耗时、任务完成时间 4. 生成对比柱状图 5. 支持不同线程数量的参数化测试。使用Java Microbenchmark框架,输出Markdown格式测试报告。
  3. 点击'项目生成'按钮,等待项目生成完整后预览效果

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

源码地址: https://pan.quark.cn/s/d1f41682e390 miyoubiAuto 米游社每日米游币自动化Python脚本(务必使用Python3) 8更新:更换cookie的获取地址 注意:禁止在B站、贴吧、或各大论坛大肆传播! 作者已退游,项目不维护了。 如果有能力的可以pr修复。 小引一波 推荐关注几个非常可爱有趣的女孩! 欢迎B站搜索: @嘉然今天吃什么 @向晚大魔王 @乃琳Queen @贝拉kira 第三方库 食用方法 下载源码 在Global.py中设置米游社Cookie 运行myb.py 本地第一次运行时会自动生产一个文件储存cookie,请勿删除 当前仅支持单个账号! 获取Cookie方法 浏览器无痕模式打开 http://user.mihoyo.com/ ,登录账号 按,打开,找到并点击 按刷新页面,按下图复制 Cookie: How to get mys cookie 当触发时,可尝试按关闭,然后再次刷新页面,最后复制 Cookie。 也可以使用另一种方法: 复制代码 浏览器无痕模式打开 http://user.mihoyo.com/ ,登录账号 按,打开,找到并点击 控制台粘贴代码并运行,获得类似的输出信息 部分即为所需复制的 Cookie,点击确定复制 部署方法--腾讯云函数版(推荐! ) 下载项目源码和压缩包 进入项目文件夹打开命令行执行以下命令 xxxxxxx为通过上面方式或取得米游社cookie 一定要用双引号包裹!! 例如: png 复制返回内容(包括括号) 例如: QQ截图20210505031552.png 登录腾讯云函数官网 选择函数服务-新建-自定义创建 函数名称随意-地区随意-运行环境Python3....
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

StarfallRaven13

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值