当前位置: 首页 > news >正文

Java线程池知识小结

一、线程池

线程池 = 存放多个线程的 “池子”。程序需要执行任务时,直接从池子里一个线程;任务执行完,线程不销毁,放回池子复用

线程池的作用:

  • 避免频繁创建 / 销毁线程(非常耗资源)
  • 控制并发线程数量(防止服务器卡死)
  • 统一管理线程(监控、调优、拒绝策略)

线程池 = 线程复用 + 控制并发 + 资源管理

Java 内置线程池的核心工具

  • ExecutorService—— 线程池接口
  • ThreadPoolExecutor—— 线程池真正实现类(最常用)

二、线程池 7 大核心参数

new ThreadPoolExecutor( int corePoolSize, // 核心线程数(常驻线程) int maximumPoolSize, // 最大线程数 long keepAliveTime, // 非核心线程空闲多久被销毁 TimeUnit unit, // 时间单位 BlockingQueue<Runnable> workQueue, // 任务队列 ThreadFactory threadFactory, // 线程工厂(命名线程) RejectedExecutionHandler handler // 拒绝策略 )

执行流程(超级重要)

  1. 任务进来 → 核心线程未满 → 创建核心线程执行
  2. 核心线程满了 → 任务放进队列排队
  3. 队列满了 → 创建非核心线程执行
  4. 总线程达到最大 → 执行拒绝策略

三、最常用的 4 种线程池(简单好用)

Java 通过Executors工具类快速创建:

1.FixedThreadPool(固定线程数)

适合:已知并发压力的任务

ExecutorService pool = Executors.newFixedThreadPool(5);

2. CachedThreadPool(自动扩容)

适合:大量短生命周期任务

ExecutorService pool = Executors.newCachedThreadPool();

3.ScheduledThreadPool(定时任务)

适合:定时、周期性执行任务

ScheduledExecutorService pool = Executors.newScheduledThreadPool(3);

4.SingleThreadExecutor(单线程)

适合:需要顺序执行的任务

ExecutorService pool = Executors.newSingleThreadExecutor();

四、拒绝策略(线程满了怎么办)

4 种内置策略:

  1. AbortPolicy(默认):直接抛异常
  2. CallerRunsPolicy:让提交任务的线程自己执行
  3. DiscardPolicy:直接丢掉任务
  4. DiscardOldestPolicy:丢掉队列最老的任务

真实开发常用:CallerRunsPolicy(最安全)

五、线程池大小如何设置?

  • CPU 密集型核心数 + 1
  • IO 密集型核心数 * 2或更多(因为 IO 会等待)

例:4 核 CPU

  • 计算任务 → 核心线程 5
  • 网络 / 数据库 → 核心线程 8~10

六、生产环境最佳线程池配置

1. 核心原则

禁止Executors快捷创建,直接手动ThreadPoolExecutor实例化,规避 OOM 风险;按业务类型区分线程池,隔离任务互不影响。

2. 参数取值规范

参数IO 密集型CPU 密集型说明
核心线程CPU 核数 ×2CPU 核数 + 1常驻核心,保障基础吞吐
最大线程核心 ×4等于核心IO 可扩容应对突发峰值
空闲存活60s0s闲置线程及时回收,节省资源
阻塞队列ArrayBlockingQueue(200)固定队列 100有界队列,杜绝无限堆积 OOM
线程工厂自定义命名自定义命名便于日志排查问题
拒绝策略CallerRunsPolicyCallerRunsPolicy不丢任务,降级由调用方执行

3. 队列选型

  • ArrayBlockingQueue:有界队列,固定容量,生产首选,可控内存
  • 禁用SynchronousQueue、无界LinkedBlockingQueue,极易引发内存溢出

4. 拒绝策略选型

生产首选CallerRunsPolicy

  • 优势:不会丢弃业务任务,削峰限流保护服务
  • 禁用默认 AbortPolicy 频繁抛异常、Discard 系列丢失数据

5. 生产运维要点

  • 线程池拆分:业务、定时、异步消息各自独立池,避免互相阻塞
  • 监控埋点:监控线程活跃数、队列积压、拒绝次数、执行耗时
  • 优雅关闭:应用下线调用shutdown(),等待任务收尾
  • 动态调参:压测后根据实际 QPS、耗时微调核心数与队列大小

6. 避坑总结

  • 不使用 Executors 创建线程池
  • 队列必须设固定上限
  • 业务分类隔离线程池
  • 自定义线程名,方便问题定位
  • 拒绝策略优先调用者执行,保障数据不丢失
http://www.jsqmd.com/news/883093/

相关文章:

  • 告别‘睁眼瞎’:用IA-YOLO的DIP模块,让你的YOLOv3在雾天和暗光下也能‘火眼金睛’
  • Beyond Compare 5密钥生成终极指南:从RSA原理到实战激活
  • 架构解析:import_3dm如何实现Rhino到Blender的无损数据迁移
  • 2025百度网盘提速终极方案:pan-baidu-download全功能使用指南
  • 2026辛集市黄金回收白银回收铂金回收店铺哪家好 实力靠谱门店排行榜推荐及联系方式 - 亦辰小黄鸭
  • 中兴光猫深度管理:用zteOnu工具解锁隐藏的管理权限
  • 5个理由告诉你为什么Mermaid Live Editor是图表创作的效率神器
  • Topit终极指南:为什么这款免费开源工具是Mac窗口置顶的最佳选择
  • Frida安卓Hook实战:5分钟稳定hook函数的完整链路
  • 从‘调参苦手’到‘一击即中’:实战解读glmnet中lambda.min与lambda.1se到底怎么选
  • SSH主机密钥变更警告:飞牛NAS登录失败的真相与解决
  • 2026忻州市黄金回收白银回收铂金回收店铺哪家好 实力靠谱门店排行榜推荐及联系方式 - 亦辰小黄鸭
  • RNN/LSTM/GRU 面试高频题|梯度消失、时序优势
  • 避坑指南:Unity VideoPlayer播放多个MP4,RenderTexture设置不对画面全黑?
  • 流体-机器人多物理场仿真:统一框架与工程实践
  • 九大网盘直连下载神器:告别龟速下载,文件传输效率提升300%
  • 2026新乐市黄金回收白银回收铂金回收店铺哪家好 实力靠谱门店排行榜推荐及联系方式 - 亦辰小黄鸭
  • D3KeyHelper终极指南:5分钟掌握暗黑3技能自动化
  • 观安信息冲刺港股:年营收7亿 利润2015万 控股股东控制45%股权
  • Unity游戏背包交互实战:用自定义Button组件实现道具的单击、双击与长按拖拽
  • 2026 郑州装修公司综合实力 TOP10:五大维度深度测评 - 资讯纵览
  • 2026新泰市黄金回收白银回收铂金回收店铺哪家好 实力靠谱门店排行榜推荐及联系方式 - 亦辰小黄鸭
  • 黑龙江省哈尔滨寄快递省钱新思路!小众靠谱线上渠道,全国低价跨省寄件少花冤枉钱 - 时讯资讯
  • Unity扁平按钮图标资源包:6000+可编程UI原子组件
  • 如何在5分钟内掌握UAssetGUI:Unreal引擎资产编辑终极指南
  • 如何解密网易云音乐NCM文件:从单个文件到批量转换的完整指南
  • 因果推断统一框架:从Riesz表示器到ATE估计方法融合
  • 不止于点灯:用STM32F4+蓝牙HM-10打造你的第一个智能硬件原型(附完整代码)
  • SISSO符号回归算法:革命性可解释AI模型的3大技术突破
  • 2026新乡市黄金回收白银回收铂金回收店铺哪家好 实力靠谱门店排行榜推荐及联系方式 - 亦辰小黄鸭