以下是 Java Executor 框架的详细解析
一、Executor 框架核心结构
1. 核心接口与类
Java Executor 框架的类结构基于以下关键接口和类构建:
- 接口:
Executor→ExecutorService→ScheduledExecutorService - 实现类:
ThreadPoolExecutor、ScheduledThreadPoolExecutor - 任务接口:
Runnable、Callable<V> - 结果容器:
Future<V>、FutureTask<V> - 工具类:
Executors(工厂方法)
2. 核心成员与功能
| 类/接口 | 核心成员或方法 | 作用 |
|---|---|---|
| Executor | void execute(Runnable) | 提交任务的基本接口 |
| ExecutorService | submit(Callable/Runnable), shutdown(), invokeAll() | 扩展任务提交和线程池管理功能 |
| ScheduledExecutorService | schedule(), scheduleAtFixedRate() | 支持定时或周期性任务调度 |
| ThreadPoolExecutor | corePoolSize, maximumPoolSize, workQueue, RejectedExecutionHandler | 线程池核心实现,控制线程生命周期和任务队列 |
| Callable | V call() throws Exception | 定义可返回结果或抛出异常的任务 |
| Future | get(), 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执行任务提交任务实现结果容器持有任务队列处理拒绝策略创建创建
三、类图解析
1. 继承与实现关系
-
接口继承:
Executor→ExecutorService→ScheduledExecutorServiceFuture→ScheduledFuture(扩展定时任务的结果状态)
-
类实现:
ThreadPoolExecutor实现ExecutorService,是线程池的核心实现。ScheduledThreadPoolExecutor继承ThreadPoolExecutor,同时实现ScheduledExecutorService,支持定时任务。
2. 关键依赖关系
-
任务提交:
ThreadPoolExecutor通过execute(Runnable)或submit(Callable)执行任务。Callable任务会被包装为FutureTask(实现Runnable和Future),最终通过线程池执行。
-
线程池配置:
ThreadPoolExecutor持有BlockingQueue(任务队列)和RejectedExecutionHandler(拒绝策略),控制任务调度逻辑。
3. 工具类 Executors
-
提供工厂方法创建预配置的线程池:
ExecutorService fixedPool = Executors.newFixedThreadPool(4); ScheduledExecutorService scheduledPool = Executors.newScheduledThreadPool(2);
四、核心成员详解(以 ThreadPoolExecutor 为例)
1. 成员变量
corePoolSize:核心线程数(即使空闲也不会回收)。maximumPoolSize:最大线程数(当队列满时创建临时线程)。workQueue:任务队列类型(如LinkedBlockingQueue、ArrayBlockingQueue)。handler:拒绝策略(如AbortPolicy、CallerRunsPolicy)。
2. 任务调度流程
- 提交任务时,若当前线程数 <
corePoolSize,直接创建新线程。 - 若线程数 ≥
corePoolSize,任务进入workQueue等待。 - 若队列已满且线程数 <
maximumPoolSize,创建临时线程。 - 若队列满且线程数达到最大值,触发拒绝策略。
五、总结
- 核心接口:
Executor→ExecutorService→ScheduledExecutorService提供任务执行和生命周期管理。 - 核心实现:
ThreadPoolExecutor和ScheduledThreadPoolExecutor是线程池的具体实现。 - 任务与结果:
Runnable/Callable定义任务,Future封装异步结果。 - 工具类:
Executors提供快捷创建线程池的方法,但需注意潜在风险(如无界队列导致内存溢出)。
通过类图和结构分析,可以清晰理解 Executor 框架如何通过线程池优化资源管理,并支持任务调度和异步结果获取。