跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
Javajava算法

Java 线程池 ThreadPoolExecutor 入门:原理、核心参数与图解

Java 线程池是并发编程核心组件,用于管理线程创建、复用与调度。 ThreadPoolExecutor 六大核心参数(核心线程数、最大线程数、队列、存活时间、工厂、拒绝策略),解析任务提交流程及四种经典实现(Fixed、Cached、Single、Scheduled)。强调生产环境应使用有界队列并手动构建线程池,避免 OOM,并根据 CPU 或 IO 密集型任务合理配置线程数。

AiEngineer发布于 2026/3/23更新于 2026/5/611K 浏览

在 Java 并发编程中,线程池(ThreadPoolExecutor) 是最重要、最常用的组件之一。 如果说 wait/notify 是'线程之间如何协作',那么线程池就是'如何管理大量线程的创建、复用与调度'。

一、为什么需要线程池?

直接创建线程存在诸多问题:

  • ❌ 创建线程成本高(线程创建需要切栈、注册、调度等)
  • ❌ 大量线程会抢占 CPU,造成性能下降
  • ❌ JVM 无法控制线程数量,容易 OOM
  • ❌ 无法统一管理任务(比如监控、统一关闭等)
  • ❌ 不适合高并发(几千、几万任务就炸)

线程池的核心思想是:

把线程复用起来,不用每次都 new Thread,而是把任务交给线程池来调度执行。

二、线程池的核心构造器(ThreadPoolExecutor)

Java 线程池的本体就是:

public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)

这六个参数是理解线程池的关键。

三、线程池六大核心参数

1)corePoolSize(核心线程数)

线程池长期存活的线程数量。

只要提交任务,核心线程池中的线程会一直存在,不会销毁(除了一些 allowCoreThreadTimeout 的特殊情况)。

2)maximumPoolSize(最大线程数)

线程池能创建的最大线程数量(核心线程 + 临时线程)。

  • 当任务很多、队列也排满时,会创建临时线程。
  • 当任务少时,这些临时线程会被回收。

3)workQueue(任务队列)

核心线程用完后,进入队列等待。

常见队列:

队列类型解释特点
LinkedBlockingQueue(默认)无界队列最常用,但可能 OOM
ArrayBlockingQueue有界队列强烈推荐用于生产
SynchronousQueue不存任务、直接交给线程用于高并发,例如 CachedThreadPool
PriorityBlockingQueue优先级队列任务可排序

队列类型直接决定线程池行为。

4)keepAliveTime(空闲线程存活时间)

临时线程空闲多久后被回收?

只对 非核心线程 生效。

5)threadFactory(线程工厂)

用于给线程自定义:

  • 名字(方便排查问题)
  • 是否为守护线程
  • 优先级

例如:

Executors.defaultThreadFactory()

6)RejectedExecutionHandler(拒绝策略)

当:

  • 线程数达到最大(maximumPoolSize)
  • 队列也满了

这时任务无法执行,就会触发 拒绝策略。

JDK 提供 4 种:

策略行为
AbortPolicy(默认)直接抛异常
DiscardPolicy直接丢弃任务
DiscardOldestPolicy丢弃队列头部任务
CallerRunsPolicy由调用者线程执行任务

线上一般用 CallerRunsPolicy,让调用线程回退压力。

四、线程池工作流程

一个任务 submit 到线程池后,会经历以下步骤:

┌──────────────┐
│ 提交任务     │
└──────┬───────┘
       ▼
是否小于 corePoolSize?
├─────────── 是 ─────────→ 创建核心线程执行
└── 否
       ▼
队列是否能放下?
├─────────── 是 ─────────→ 进入队列等待
└── 否
       ▼
是否小于 maximumPoolSize?
├─────────── 是 ─────────→ 创建临时线程执行
└── 否
       ▼
拒绝策略

五、线程池的四大经典实现

JDK 自带 Executors 快速创建线程池的方法,但 不推荐 在实际生产使用(因为容易 OOM)。

1)FixedThreadPool(固定线程池)

Executors.newFixedThreadPool(4);

特点:

  • 核心线程 = 最大线程
  • 无界队列 → 可能 OOM
  • 适合 CPU 密集型任务
2)CachedThreadPool(缓存线程池)

Executors.newCachedThreadPool();

特点:

  • 核心线程 0
  • 最大线程 Integer.MAX_VALUE
  • SynchronousQueue(不排队)→ 能创建无限线程 → 极高并发 → 也可能炸
3)SingleThreadExecutor(单线程池)

保证任务按顺序执行。

4)ScheduledThreadPool(定时任务线程池)

功能类似 Timer,但更强大。

六、线程池最佳实践(项目级建议)

✔ 使用 有界队列(ArrayBlockingQueue),避免 OOM ✔ 手动 new ThreadPoolExecutor,不用 Executors ✔ 根据任务类型决定线程数:

  • CPU 密集:线程数 = CPU 核数 + 1
  • IO 密集:线程数 = CPU 核数 * 2 或更多

✔ 记得设置线程名(threadFactory)方便排查

✔ 适当使用拒绝策略做流控 → CallerRunsPolicy

七、总结

线程池的核心思想:复用线程,减少创建开销。

核心参数作用:

  • corePoolSize:最小常驻线程数
  • maximumPoolSize:最大线程数
  • workQueue:任务排队的地方
  • keepAliveTime:临时线程多久回收
  • threadFactory:线程名字
  • handler:拒绝策略

线程池执行流程: 核心线程 → 队列 → 临时线程 → 拒绝策略

目录

  1. 一、为什么需要线程池?
  2. 二、线程池的核心构造器(ThreadPoolExecutor)
  3. 三、线程池六大核心参数
  4. 1)corePoolSize(核心线程数)
  5. 2)maximumPoolSize(最大线程数)
  6. 3)workQueue(任务队列)
  7. 4)keepAliveTime(空闲线程存活时间)
  8. 5)threadFactory(线程工厂)
  9. 6)RejectedExecutionHandler(拒绝策略)
  10. 四、线程池工作流程
  11. 五、线程池的四大经典实现
  12. 1)FixedThreadPool(固定线程池)
  13. 2)CachedThreadPool(缓存线程池)
  14. 3)SingleThreadExecutor(单线程池)
  15. 4)ScheduledThreadPool(定时任务线程池)
  16. 六、线程池最佳实践(项目级建议)
  17. 七、总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • GPT-5.5 超高智商模型1元抵1刀ChatGPT中转购买
  • 代充Chatgpt Plus/pro 帐号了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 基于 Django 与 Vue 的酒店管理系统设计与实现
  • 分布式环境下高可靠分布式锁的实现与优化
  • Spring Cloud 分布式智能推荐系统实战
  • SpringAI Agent 开发:使用 Agent Skills 进行代码评审
  • AI 视频生成模型构建、实现与调试指南
  • Python Pillow 图像处理与格式转换详解
  • Python 异步编程与协程实战指南
  • OpenClaw 本地部署与飞书集成实战
  • Kafka 核心架构与分布式存储深度解析
  • iOS 新系统兼容适配:UITabBar 液态玻璃效果与 WiFi SSID 获取
  • Java 类和对象
  • SageMaker 部署 AIGC 应用:训练、优化、部署及 Web 前端集成
  • 基于 ArkUI 的鸿蒙五子棋游戏开发实战
  • MATLAB 智能代码生成工具 Copilot_AI 功能介绍
  • VsCode 远程连接服务器后 GitHub Copilot 无法使用修复方案
  • Ubuntu 26.04 LTS 新特性前瞻:坚毅浣熊发布计划与核心更新
  • Web 自动化测试入门:从概念到百度搜索实战
  • DeepSeek-R1 大模型基于 MS-Swift 框架的部署、推理与微调实践
  • Axure 实现 AI 自动对话机器人原型教程
  • 大模型开发生态总结与工业应用思考

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online