ExecutorService是Java中管理线程生命周期的核心工具,通过Executors创建线程池,如newFixedThreadPool(4)创建固定大小线程池;使用submit提交任务并返回Future获取结果或捕获异常;需调用shutdown()停止接收新任务,配合awaitTermination等待执行完成,必要时shutdownNow()强制中断;关闭不及时可能导致JVM无法退出;可通过getActiveCount()、getQueue().size()等方法监控状态,但需将ExecutorService转为ThreadPoolExecutor;合理使用可控制资源消耗,避免线程泛滥,保障程序稳定。

在Java中,ExecutorService 是并发编程中管理线程生命周期的核心工具。它封装了线程的创建、调度和销毁过程,让开发者无需手动管理线程状态,从而提升程序的可维护性和性能。
创建并启动线程池
通过 Executors 工具类可以快速创建不同类型的线程池,实际使用的是 ExecutorService 接口的实现。
常见方式包括:- newFixedThreadPool(n):创建固定大小的线程池
- newCachedThreadPool():创建可缓存的线程池,按需创建线程
- newSingleThreadExecutor():单线程池,保证任务串行执行
示例:
ExecutorService executor = Executors.newFixedThreadPool(4);
executor.submit(() -> {
System.out.println("任务正在执行,线程:" + Thread.currentThread().getName());
});
正确关闭线程池
如果不关闭线程池,JVM 可能无法正常退出,因为核心线程默认是守护线程,会持续等待新任务。
立即学习“Java免费学习笔记(深入)”;
推荐使用以下步骤优雅关闭:- shutdown():停止接收新任务,已提交的任务继续执行
- awaitTermination():设置最大等待时间,确保任务完成
- shutdownNow():尝试中断所有运行中的任务(不保证立即生效)
标准关闭流程示例:
executor.shutdown();
try {
if (!executor.awaitTermination(60, TimeUnit.SECONDS)) {
executor.shutdownNow();
}
} catch (InterruptedException e) {
executor.shutdownNow();
Thread.currentThread().interrupt();
}
监控线程池状态
对于需要动态调整或排查问题的场景,可通过 ThreadPoolExecutor 提供的方法获取运行状态。
常用方法包括:- getActiveCount():当前活跃线程数
- getQueue().size():等待执行的任务数量
- getCompletedTaskCount():已完成任务总数
注意:若使用 Executors 创建的实例,需提前向下转型为 ThreadPoolExecutor 才能调用这些方法。
处理异常与返回结果
submit() 方法支持返回 Future 对象,可用于获取执行结果或捕获异常。
Futurefuture = executor.submit(() -> { if (true) throw new RuntimeException("任务出错"); return "success"; }); try { String result = future.get(); // 阻塞直到完成 } catch (ExecutionException e) { System.out.println("任务执行失败:" + e.getCause().getMessage()); }
基本上就这些。合理使用 ExecutorService 能有效控制资源消耗,避免线程泛滥,同时通过规范的启停流程保障程序稳定运行。关键在于及时关闭线程池,并妥善处理任务异常。










