Executor 框架详解

85 阅读3分钟

以下是 Java Executor 框架的详细解析


一、Executor 框架核心结构

1. 核心接口与类

Java Executor 框架的类结构基于以下关键接口和类构建:

  • 接口ExecutorExecutorServiceScheduledExecutorService
  • 实现类ThreadPoolExecutorScheduledThreadPoolExecutor
  • 任务接口RunnableCallable<V>
  • 结果容器Future<V>FutureTask<V>
  • 工具类Executors(工厂方法)

2. 核心成员与功能

类/接口核心成员或方法作用
Executorvoid execute(Runnable)提交任务的基本接口
ExecutorServicesubmit(Callable/Runnable), shutdown(), invokeAll()扩展任务提交和线程池管理功能
ScheduledExecutorServiceschedule(), scheduleAtFixedRate()支持定时或周期性任务调度
ThreadPoolExecutorcorePoolSize, maximumPoolSize, workQueue, RejectedExecutionHandler线程池核心实现,控制线程生命周期和任务队列
CallableV call() throws Exception定义可返回结果或抛出异常的任务
Futureget(), isDone(), cancel()封装异步任务的结果或状态

二、类图(Mermaid 语法)

«interface»Executor+execute(Runnable command) : void«interface»ExecutorService+submit(Callable<V>) : Future<V>+shutdown() : void+shutdownNow() : List<Runnable>«interface»ScheduledExecutorService+schedule(Runnable, long, TimeUnit) : ScheduledFuture<V>+scheduleAtFixedRate(...) : ScheduledFuture<V>«interface»Runnable+run() : void«interface»Callable<V>V throws«interface»Future<V>+get() : V+isDone() : boolean«interface»ScheduledFuture<V>+getDelay(TimeUnit) : longThreadPoolExecutor-corePoolSize: int-maximumPoolSize: int-keepAliveTime: long-workQueue: BlockingQueue<Runnable>-handler: RejectedExecutionHandler+execute(Runnable) : void+submit(Callable<V>) : Future<V>ScheduledThreadPoolExecutor+schedule(...) : ScheduledFuture<V>+scheduleAtFixedRate(...) : ScheduledFuture<V>FutureTask<V>-callable: Callable<V>-state: int+run() : void+get() : V«utility»Executors+newFixedThreadPool(int) : ExecutorService+newCachedThreadPool() : ExecutorService+newScheduledThreadPool(int) : ScheduledExecutorServiceBlockingQueue<Runnable>RejectedExecutionHandler执行任务提交任务实现结果容器持有任务队列处理拒绝策略创建创建

image.png


三、类图解析

1. 继承与实现关系

  • 接口继承

    • ExecutorExecutorServiceScheduledExecutorService
    • FutureScheduledFuture(扩展定时任务的结果状态)
  • 类实现

    • ThreadPoolExecutor 实现 ExecutorService,是线程池的核心实现。
    • ScheduledThreadPoolExecutor 继承 ThreadPoolExecutor,同时实现 ScheduledExecutorService,支持定时任务。

2. 关键依赖关系

  • 任务提交

    • ThreadPoolExecutor 通过 execute(Runnable)submit(Callable) 执行任务。
    • Callable 任务会被包装为 FutureTask(实现 RunnableFuture),最终通过线程池执行。
  • 线程池配置

    • ThreadPoolExecutor 持有 BlockingQueue(任务队列)和 RejectedExecutionHandler(拒绝策略),控制任务调度逻辑。

3. 工具类 Executors

  • 提供工厂方法创建预配置的线程池:

    ExecutorService fixedPool = Executors.newFixedThreadPool(4);
    ScheduledExecutorService scheduledPool = Executors.newScheduledThreadPool(2);
    

四、核心成员详解(以 ThreadPoolExecutor 为例)

1. 成员变量

  • corePoolSize:核心线程数(即使空闲也不会回收)。
  • maximumPoolSize:最大线程数(当队列满时创建临时线程)。
  • workQueue:任务队列类型(如 LinkedBlockingQueueArrayBlockingQueue)。
  • handler:拒绝策略(如 AbortPolicyCallerRunsPolicy)。

2. 任务调度流程

  1. 提交任务时,若当前线程数 < corePoolSize,直接创建新线程。
  2. 若线程数 ≥ corePoolSize,任务进入 workQueue 等待。
  3. 若队列已满且线程数 < maximumPoolSize,创建临时线程。
  4. 若队列满且线程数达到最大值,触发拒绝策略。

五、总结

  • 核心接口ExecutorExecutorServiceScheduledExecutorService 提供任务执行和生命周期管理。
  • 核心实现ThreadPoolExecutorScheduledThreadPoolExecutor 是线程池的具体实现。
  • 任务与结果Runnable/Callable 定义任务,Future 封装异步结果。
  • 工具类Executors 提供快捷创建线程池的方法,但需注意潜在风险(如无界队列导致内存溢出)。

通过类图和结构分析,可以清晰理解 Executor 框架如何通过线程池优化资源管理,并支持任务调度和异步结果获取。