一、前言
在高并发场景下,频繁创建和销毁线程会带来巨大的性能开销 —— 线程的创建需要分配栈空间、寄存器等系统资源,销毁需要回收这些资源,大量的线程还会引发 CPU 上下文切换的成本飙升。线程池作为 Java 并发编程的核心工具,通过复用线程、控制并发数、管理任务队列,有效解决了上述问题,是提升高并发程序性能的关键手段。
本文将深入剖析线程池的核心原理、ThreadPoolExecutor 的 7 个核心参数、工作流程,并结合实战案例讲解线程池的配置与使用。
二、线程池的核心价值
- **线程复用:**线程池会维护一定数量的核心线程,任务执行完毕后线程不会立即销毁,而是等待执行下一个任务,避免了线程创建和销毁的开销。
- **控制最大并发数:**通过限制线程池的最大线程数,防止大量线程抢占 CPU 和内存资源,避免系统因资源耗尽而瘫痪。
- **任务队列管理:**当线程池的核心线程都处于忙碌状态时,新任务会被放入阻塞队列等待,实现任务的缓冲和有序执行。
- **提供拒绝策略:**当任务队列满且最大线程数已达上限时,线程池会根据预设的拒绝策略处理新任务,避免任务丢失或系统过载。
- **支持任务监控:**线程池提供了 getPoolSize()、getActiveCount() 等方法,方便监控线程池的运行状态,便于问题排查和性能调优。
三、线程池的核心类与接口
Java 线程池的核心接口和类位于 java.util.concurrent 包下,核心结构如下:
- **Executor:**最顶层接口,仅定义了 execute(Runnable command) 方法,用于执行任务。
- **ExecutorService:**继承 Executor,扩展了线程池的生命周期管理方法,如 shutdown()、submit()、awaitTermination() 等。
- **AbstractExecutorService:**实现 ExecutorService 接口,提供了 submit() 等方法的默认实现。
- **ThreadPoolExecutor:**继承 AbstractExecutorService,是线程池的核心实现类,实现了线程池的创建、任务调度、线程管理等核心逻辑。
- **Executors:**线程池工具类,提供了 newFixedThreadPool()、newCachedThreadPool() 等静态方法,快速创建常用的线程池(生产环境不推荐直接使用)。
四、核心参数
ThreadPoolExecutor 的核心构造方法如下:
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
这 7 个参数决定了线程池的运行机制,缺一不可,下面逐一解析:
1. corePoolSize:核心线程数
**定义:**线程池长期维持的线程数量,即使线程处于空闲状态,也不会被销毁(除非设置了 allowCoreThreadTimeOut(true))。
工作机制:
- 当提交任务数 < corePoolSize 时,线程池会创建新线程执行任务,直到线程数达到 corePoolSize。
- 当线程数达到 corePoolSize 后,新任务会被放入任务队列等待执行。
2. maximumPoolSize:最大线程数
**定义:**线程池允许创建的最大线程数量,是线程池的容量上限。
**工作机制:**当任务队列已满,且提交的任务数 > corePoolSize 时,线程池会创建新的非核心线程执行任务,直到线程数达到 maximumPoolSize。


