在Java并发编程中,ExecutorService是用来管理线程池的核心接口。它位于java.util.concurrent包下,把任务的提交和线程的具体执行解耦,开发者只需要把Runnable或Callable丢进去,剩下的线程调度由框架完成。

ExecutorService的基本结构
ExecutorService是一个接口,常用的实现类包括ThreadPoolExecutor和ScheduledThreadPoolExecutor。我们通过Executors工厂类可以快速创建几种典型线程池,例如固定大小线程池、缓存线程池等。
常见创建方式
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Demo {
public static void main(String[] args) {
// 创建固定大小为4的线程池
ExecutorService pool = Executors.newFixedThreadPool(4);
// 提交任务
pool.execute(() -> System.out.println("任务执行"));
// 关闭线程池
pool.shutdown();
}
}
线程池如何管理线程
以ThreadPoolExecutor为例,它通过几个关键参数控制线程生命周期:
- corePoolSize:核心线程数,常驻内存
- maximumPoolSize:最大线程数,队列满时扩容
- workQueue:任务阻塞队列
- keepAliveTime:非核心线程空闲存活时间
当提交任务时,若正在运行的线程少于核心线程数,会立即新建线程;若达到核心数,任务进队列;队列满且未达最大线程数,再建新线程;都满了就触发拒绝策略。
参数对照表
| 参数 | 作用 |
|---|---|
| corePoolSize | 保持的最小工作线程数 |
| maximumPoolSize | 允许的最大线程数 |
| workQueue | 存放待执行任务 |
任务的提交与关闭
ExecutorService提供execute()提交无返回任务,submit()提交有返回值的Callable任务。关闭时要用shutdown()或shutdownNow(),否则程序可能不会退出。
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class CloseDemo {
public static void main(String[] args) throws InterruptedException {
ExecutorService pool = Executors.newCachedThreadPool();
pool.submit(() -> System.out.println("hello"));
// 平缓关闭
pool.shutdown();
// 等待终止
pool.awaitTermination(1, TimeUnit.MINUTES);
}
}
使用中的注意点
不要用无界队列配合newFixedThreadPool放任任务堆积,也不要把线程池定义为局部变量频繁创建。正确理解ExecutorService的管理逻辑,才能写出稳定的Java并发程序。
ExecutorService线程池Java并发修改时间:2026-07-30 19:21:17