三分钟掌握 Java 线程池 Executor 框架的体系结构

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:过渡状态
  • 任务处理流程
    1. 核心线程未满 → 创建新线程
    2. 核心线程已满 → 任务入队列
    3. 队列已满且线程数未达最大值 → 创建非核心线程
    4. 队列已满且线程数达最大值 → 触发拒绝策略

与框架的集成

  • 继承AbstractExecutorService,实现所有提交任务的方法
  • 通过execute()方法实现具体任务调度逻辑

体系结构关系图(完整版)

%%{init: {'theme': 'neutral'}}%% classDiagram direction 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 <|-- ExecutorService ExecutorService <|.. AbstractExecutorService AbstractExecutorService <|-- ThreadPoolExecutor ExecutorService <|-- ScheduledExecutorService ScheduledExecutorService <|.. ScheduledThreadPoolExecutor Executors ..> ThreadPoolExecutor : 创建 Executors ..> ScheduledThreadPoolExecutor : 创建 %% 实现关系说明 note for ThreadPoolExecutor "实现任务调度核心逻辑\n- 线程复用机制\n- 队列管理策略\n- 拒绝策略处理" note for Executors "工具类提供:\n- newFixedThreadPool()\n- newCachedThreadPool()\n- newSingleThreadExecutor()"

图解说明

  1. 接口用<<interface>>标记,抽象类用<<abstract>>
  2. 实线空心箭头表示继承(extends)
  3. 虚线空心箭头表示实现(implements)
  4. 虚线箭头表示依赖关系
  5. 核心实现类ThreadPoolExecutor包含关键字段和方法
  6. 右侧注释块使用note for语法添加关键说明

关键设计思想

  1. 接口隔离原则
    • Executor仅定义执行标准
    • ExecutorService扩展管理功能
  2. 模板方法模式
    • AbstractExecutorService实现通用逻辑
    • 子类只需实现execute()等关键方法
  3. 资源控制
    • 通过BlockingQueue控制任务堆积
    • 通过RejectedExecutionHandler处理过载

使用建议:直接使用ThreadPoolExecutor构造函数创建线程池(而非Executors工厂方法),以明确控制所有参数,避免资源耗尽风险。

posted @ 2025-03-06 00:23  皮皮是个不挑食的好孩子  阅读(82)  评论(0)    收藏  举报