在 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(空闲线程存活时间)
临时线程空闲多久后被回收?

