讲师中心 微信公众号
AI工具推荐 视频效率加速

Java线程池创建为什么要自定义 Java不推荐使用Executors原因【技巧】

夜静姑娘_4974

夜静姑娘_4974

发布时间:2026-02-13 08:15:34

|

889人浏览过

|

来源于php中文网

原创

Executors.newFixedThreadPool易OOM的根本原因是其默认使用无界LinkedBlockingQueue,任务持续提交而消费慢时队列无限堆积导致堆内存耗尽;newCachedThreadPool因SynchronousQueue+无限线程数更易触发unable to create new native thread;newSingleThreadExecutor和newScheduledThreadPool同理存在无界队列隐患。

java线程池创建为什么要自定义 java不推荐使用executors原因【技巧】

Executors.newFixedThreadPool 为什么容易 OOM

根本原因是它内部使用的 LinkedBlockingQueue 默认无界(容量为 Integer.MAX_VALUE),任务持续提交但消费速度跟不上时,队列无限堆积,最终耗尽堆内存。这不是线程池“不安全”,而是设计上把背压策略完全交给了调用方,而多数人没意识到这点。

  • 典型场景:上游 HTTP 请求洪峰 + 下游 DB 响应变慢 → 任务在队列里越积越多
  • newCachedThreadPool 更危险:核心线程数 0、最大线程数 Integer.MAX_VALUE,加上 SynchronousQueue,会疯狂创建线程,直接触发 OutOfMemoryError: unable to create new native thread
  • newSingleThreadExecutor 和 newScheduledThreadPool 同样使用无界队列,存在相同隐患

自定义线程池必须显式控制的三个参数

绕过 Executors 工厂方法后,你得亲手填满 ThreadPoolExecutor 构造函数的七个参数,但真正关键的是前五个,尤其以下三个必须按业务收敛:

  • corePoolSize:常驻线程数,别拍脑袋设成 CPU 核数 × 2;IO 密集型可稍高(如 20~50),CPU 密集型建议 ≤ CPU 核数 + 1
  • maximumPoolSize:最大线程数,要和拒绝策略联动;设太大等于放弃控制,设太小又浪费资源
  • workQueue:必须用有界队列,比如 new ArrayBlockingQueue(100);容量不是越大越好,得结合平均处理时长和可接受排队时长反推(例如:TP99=200ms,允许最长排队 2s → 队列 ≈ 10)

拒绝策略选哪个?要看你的服务是否可降级

默认的 AbortPolicy 直接抛 RejectedExecutionException,对 RPC 接口可能合适(让上游重试),但对后台异步日志就太粗暴了。常见选择:

Alibabacloud Sdk Client Initialization For Java
Alibabacloud Sdk Client Initialization For Java

在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。

下载
  • CallerRunsPolicy:由提交线程自己执行任务,能自然减速,适合非关键路径(如统计埋点)
  • 自定义策略:比如把任务写入 Kafka 或 Redis 延迟队列,后续补偿处理;注意别在拒绝逻辑里再调用 execute(),否则可能栈溢出
  • 千万别用 DiscardPolicy 默默丢弃——除非你确认丢的是心跳或 ping 类无副作用任务

还有两个容易被跳过的初始化细节

很多人写了 ThreadPoolExecutor 构造,却漏掉线程工厂和拒绝策略的显式指定,导致排查困难:

立即学习“Java免费学习笔记(深入)”;

  • 线程名不设 ThreadFactory → 所有线程叫 pool-1-thread-1,线上出问题根本分不清是哪个业务线程池在狂打 GC
  • 不传 RejectedExecutionHandler → 默认用 AbortPolicy,但异常堆栈里看不到是哪个线程池抛的,得靠线程名或监控指标反推
  • 示例:new ThreadPoolExecutor(4, 8, 60L, TimeUnit.SECONDS, new ArrayBlockingQueue(100), r -> new Thread(r, "order-process-pool-%d"), new ThreadPoolExecutor.CallerRunsPolicy())
线程池不是配置完就一劳永逸的东西;队列大小、拒绝策略、线程命名这些看似次要的点,在流量突增或下游抖动时,往往就是区分“平稳降级”和“雪崩”的那条线。

热门AI工具

更多
SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
kafka消费者组有什么作用
kafka消费者组有什么作用

kafka消费者组的作用:1、负载均衡;2、容错性;3、广播模式;4、灵活性;5、自动故障转移和领导者选举;6、动态扩展性;7、顺序保证;8、数据压缩;9、事务性支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2246

2024.01.12

kafka消费组的作用是什么
kafka消费组的作用是什么

kafka消费组的作用:1、负载均衡;2、容错性;3、灵活性;4、高可用性;5、扩展性;6、顺序保证;7、数据压缩;8、事务性支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

550

2024.02.23

rabbitmq和kafka有什么区别
rabbitmq和kafka有什么区别

rabbitmq和kafka的区别:1、语言与平台;2、消息传递模型;3、可靠性;4、性能与吞吐量;5、集群与负载均衡;6、消费模型;7、用途与场景;8、社区与生态系统;9、监控与管理;10、其他特性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

524

2024.02.23

Java 流式处理与 Apache Kafka 实战
Java 流式处理与 Apache Kafka 实战

本专题专注讲解 Java 在流式数据处理与消息队列系统中的应用,系统讲解 Apache Kafka 的基础概念、生产者与消费者模型、Kafka Streams 与 KSQL 流式处理框架、实时数据分析与监控,结合实际业务场景,帮助开发者构建 高吞吐量、低延迟的实时数据流管道,实现高效的数据流转与处理。

570

2026.02.04

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

3048

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

4309

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3689

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

386

2026.01.19

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

120

2026.09.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn