一、Executors 概述
java.util.concurrent.Executors 是线程池的工具类 ,提供静态方法快速创建不同类型线程池,底层全部是封装了 ThreadPoolExecutor 的构造器,简化代码编写。
⚠️阿里巴巴开发手册强制规范:生产环境禁止使用 Executors 创建线程池 ,容易引发 OOM 内存溢出,仅用于测试、学习场景。 接口:
ExecutorService代表线程池对象。
二、Executors 4 大静态方法
1. newFixedThreadPool (int nThreads) 固定线程池
java
// 创建固定数量的核心线程,无临时线程
ExecutorService pool = Executors.newFixedThreadPool(3);
- 参数:线程数量固定
- 底层源码:
java
new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
- 参数解读:核心线程数 = 最大线程数,没有临时线程 ;阻塞队列
LinkedBlockingQueue默认容量Integer.MAX_VALUE(无限队列) - 特点:线程数量固定,线程不会被回收;任务多了会无限往队列放。
- 风险:任务大量堆积,队列无限长 → OOM 内存溢出
2. newSingleThreadExecutor () 单线程池
java
ExecutorService pool = Executors.newSingleThreadExecutor();
- 底层:核心线程 = 1,最大线程 = 1,无限阻塞队列
- 特点:池内永远只有1 个线程,任务串行依次执行;适合任务需要顺序执行场景。
- 风险:同样无限队列,任务堆积 OOM。
3. newCachedThreadPool () 可缓存线程池
java
ExecutorService pool = Executors.newCachedThreadPool();
- 底层源码:
java
new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
- 参数解读:0 个核心线程 ;最大线程数为
Integer.MAX_VALUE;临时线程空闲 60 秒自动销毁;队列SynchronousQueue不存储任务,来了任务直接创建线程。 - 特点:按需创建线程;线程空闲 60s 自动回收。
- 风险:任务瞬间大量涌入,会疯狂新建线程,线程数量过多,CPU 耗尽,OOM。
4. newScheduledThreadPool (int corePoolSize) 定时线程池
java
// 支持延迟执行、周期性重复执行任务
ScheduledExecutorService pool = Executors.newScheduledThreadPool(2);
- 返回值:
ScheduledExecutorService,继承ExecutorService,额外支持定时任务 - 特点:可以延迟一段时间执行任务,或者每隔一段时间重复执行任务。
- 风险:最大线程数
Integer.MAX_VALUE,大量任务会创建大量线程,OOM。
三、代码示例演示
示例 1:newFixedThreadPool
java
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ExecutorsDemo {
public static void main(String[] args) {
// 创建固定3个线程的线程池
ExecutorService pool = Executors.newFixedThreadPool(3);
// 提交5个任务
for (int i = 1; i <= 5; i++) {
pool.submit(() -> {
System.out.println(Thread.currentThread().getName() + "正在执行任务");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
// 关闭线程池:不再接收新任务,执行完现有任务再关闭
pool.shutdown();
}
}
示例 2:定时线程池(延迟执行)
java
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class ScheduledPoolDemo {
public static void main(String[] args) {
ScheduledExecutorService pool = Executors.newScheduledThreadPool(2);
// 参数:任务,延迟多久执行,时间单位
pool.schedule(() -> {
System.out.println("延迟3秒执行");
},3, TimeUnit.SECONDS);
}
}
四、ExecutorService 线程池常用方法
| 方法 | 作用 |
|---|---|
execute(Runnable task) |
提交无返回值任务 |
submit(task) |
提交任务,支持 Runnable/Callable,返回 Future 对象,可以拿到任务返回结果 |
shutdown() |
平缓关闭线程池,不接收新任务,等待已经提交的任务执行完毕 |
shutdownNow() |
立刻尝试关闭,中断正在运行任务,返回队列里未执行的任务列表 |
isShutdown() |
判断线程池是否已经关闭 |
五、重点面试总结(必背)
- Executors 是什么?
线程池工具类,静态方法快速创建线程池,底层封装 ThreadPoolExecutor。
- 为什么生产不推荐 Executors?
- newFixedThreadPool /newSingleThreadExecutor:阻塞队列是无限长,大量任务堆积 → OOM
- newCachedThreadPool /newScheduledThreadPool:最大线程数无限,大量任务会创建海量线程 → OOM
✅生产推荐:手动
new ThreadPoolExecutor(),自定义 7 个参数,限制队列长度、最大线程数。
- 四个线程池简单区分
- newFixedThreadPool:固定数量线程
- newSingleThreadExecutor:单线程,串行执行
- newCachedThreadPool:自动按需创建、回收临时线程
- newScheduledThreadPool:延迟 / 周期定时任务
六、Executors 和 ThreadPoolExecutor 的关系
ThreadPoolExecutor:线程池实现类,原生构造器,7 个参数,可控,生产推荐Executors:工具类,只是帮你 new ThreadPoolExecutor,帮你填好参数,简化代码ExecutorService:线程池接口,定义线程池的行为方法