Executor框架是Java并发包中用于解耦任务提交和执行的重要部分。
- 顶层接口是Executor,它只有一个execute方法。
- 然后是ExecutorService,扩展了Executor,增加了生命周期管理和任务跟踪的方法。
- ThreadPoolExecutor则是具体的实现类。
Executor框架体系结构详解
Java线程池的核心设计基于Executor框架,这是一个典型的命令模式实现,将任务提交与执行逻辑解耦。其核心类/接口的层次结构如下:
(顶层接口)Executor↑ExecutorService (扩展接口)↑AbstractExecutorService (抽象类)↑ThreadPoolExecutor (核心实现类)
1. Executor 接口
定位:任务执行的抽象(定义执行标准)
核心方法:
void execute(Runnable command);
关键特性:
- 仅定义一个标准:如何执行
Runnable
任务 - 不强制要求异步执行(例如,可用直接调用
command.run()
) - 设计意义:解耦任务提交与执行策略(单线程/线程池/远程执行等)
示例:
Executor directExecutor = command -> command.run(); // 同步执行
Executor threadPerTaskExecutor = command -> new Thread(command).start(); // 每个任务新线程
2. ExecutorService 接口
定位:增强型执行服务(扩展生命周期管理、任务跟踪)
扩展功能:
- 管理线程池状态(启动、关闭、终止)
- 支持返回
Future
的任务提交方式(submit()
方法) - 批量任务处理(
invokeAll()
/invokeAny()
)
核心方法:
void shutdown(); // 优雅关闭(处理已提交任务)
List<Runnable> shutdownNow(); // 立即终止(返回未处理任务)
boolean isShutdown(); // 是否已关闭
<T> Future<T> submit(Callable<T> task); // 提交有返回值的任务
// ...其他方法
典型实现:
ThreadPoolExecutor
:标准线程池实现ForkJoinPool
:分治任务专用线程池(Java 7+)ScheduledThreadPoolExecutor
:支持定时/周期性任务
3. AbstractExecutorService 抽象类
定位:ExecutorService
的默认骨架实现
作用:
- 实现
submit()
/invokeAll()
等通用方法 - 将
Runnable
任务包装为Callable
- 留空
execute()
方法供具体实现类重写
关键代码片段:
public <T> Future<T> submit(Runnable task, T result) {RunnableFuture<T> ftask = newTaskFor(task, result);execute(ftask); // 最终调用子类实现的execute()return ftask;
}
4. ThreadPoolExecutor 类
定位:标准线程池实现(核心类)
核心机制:
- 线程池状态控制(通过AtomicInteger同时存储状态和线程数):
RUNNING
:接收新任务,处理队列任务SHUTDOWN
:不接收新任务,处理队列任务STOP
:不接收新任务,不处理队列任务,中断进行中任务TIDYING
/TERMINATED
:过渡状态
- 任务处理流程:
- 核心线程未满 → 创建新线程
- 核心线程已满 → 任务入队列
- 队列已满且线程数未达最大值 → 创建非核心线程
- 队列已满且线程数达最大值 → 触发拒绝策略
与框架的集成:
- 继承
AbstractExecutorService
,实现所有提交任务的方法 - 通过
execute()
方法实现具体任务调度逻辑
体系结构关系图(完整版)
%%{init: {'theme': 'neutral'}}%%
classDiagramdirection TB%% 核心接口与类class Executor {<<interface>>+execute(Runnable command) void}class ExecutorService {<<interface>>+shutdown() void+shutdownNow() List~Runnable~+submit(Callable<T> task) Future<T>+invokeAll(...) List~Future<T>~+...其他方法}class AbstractExecutorService {<<abstract>>+submit(Runnable task) Future<?>+invokeAll(...) 实现#newTaskFor(...) RunnableFuture<T>+...模板方法}class ThreadPoolExecutor {-corePoolSize: int-maximumPoolSize: int-workQueue: BlockingQueue<Runnable>+execute(Runnable command) void+shutdown() void+...线程池核心实现}class ScheduledExecutorService {<<interface>>+schedule(...) ScheduledFuture<?>+scheduleAtFixedRate(...) +...定时任务方法}class ScheduledThreadPoolExecutor {+schedule(...) 实现+...定时任务扩展实现}%% 工厂类class Executors {+newFixedThreadPool() ExecutorService+newCachedThreadPool() ExecutorService+newScheduledThreadPool() ScheduledExecutorService+...工厂方法}%% 关系定义Executor <|-- ExecutorServiceExecutorService <|.. AbstractExecutorServiceAbstractExecutorService <|-- ThreadPoolExecutorExecutorService <|-- ScheduledExecutorServiceScheduledExecutorService <|.. ScheduledThreadPoolExecutorExecutors ..> ThreadPoolExecutor : 创建Executors ..> ScheduledThreadPoolExecutor : 创建%% 实现关系说明note for ThreadPoolExecutor "实现任务调度核心逻辑\n- 线程复用机制\n- 队列管理策略\n- 拒绝策略处理"note for Executors "工具类提供:\n- newFixedThreadPool()\n- newCachedThreadPool()\n- newSingleThreadExecutor()"
图解说明:
- 接口用
<<interface>>
标记,抽象类用<<abstract>>
- 实线空心箭头表示继承(extends)
- 虚线空心箭头表示实现(implements)
- 虚线箭头表示依赖关系
- 核心实现类
ThreadPoolExecutor
包含关键字段和方法 - 右侧注释块使用
note for
语法添加关键说明
关键设计思想
- 接口隔离原则:
Executor
仅定义执行标准ExecutorService
扩展管理功能
- 模板方法模式:
AbstractExecutorService
实现通用逻辑- 子类只需实现
execute()
等关键方法
- 资源控制:
- 通过
BlockingQueue
控制任务堆积 - 通过
RejectedExecutionHandler
处理过载
- 通过
使用建议:直接使用ThreadPoolExecutor
构造函数创建线程池(而非Executors
工厂方法),以明确控制所有参数,避免资源耗尽风险。