三分钟掌握 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'}}%% 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()"

图解说明

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

关键设计思想

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/894255.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【多线程】volatile关键字详解

volatile的作用volatile主要用于解决可见性和有序性的问题,但不保证原子性可见性:线程在操作变量时,会将主存中的变量拷贝一份到本地存储;修改有再找时机写回主存(不可控),这样多线程并发时会导致其他线程看到的数据和当前线程不一致 使用volatile关键字修饰变量,可使得每…

WiFiGrab教程2:一键抓包5G并使用字典破解全流程

本文使用WiFiGrab抓取5G无线网络的握手包,实验对象为自己的路由器,并结合EWSA进行字典攻击,演示暴力破解的原理和全流程操作。WiFiGrab抓包5G 本文使用WiFiGrab抓取5G无线网络的握手包,实验对象为自己的路由器,并结合EWSA进行字典攻击,演示暴力破解的原理和全流程操作。软…

phylip 中利用NJ法构建进化树

001、测试文件vcf文件(base) [b20223040323@admin2 02_NJ_tree]$ ls outcome.vcf 002、格式转换;输入文件为vcf文件run_pipeline.pl -Xms1G -Xmx5G -importGuess outcome.vcf -ExportPlugin -saveAs sequences.phy -format Phylip_Inter ## 格式转换 003、

vue的深度学习

vue的深度学习 本次学习了vue脚手架的知识,使用的是选项api,初步分析 对于脚手架目录进行简单分析 src:用于存放源码,我们一般写代码的地方,其中的app.vue是根组件,components中存放其他组件,其他组件可以加到根组件下方 <template><div class="fullName"&g…

代码随想录算法训练营day23 | 39. 组合总和、40.组合总和II、131.分割回文串

组合总和点击查看代码 class Solution { public:vector<vector<int>> result;vector<int> path;void backtracking(vector<int>& candidates, int &target, int sum, int startIndex) {//由于for循环条件已经提前做了递归终止判断,故这里不用…

2023-3-5-ai试用

今天使用了ai来做简单的项目,这是我发给ai的话语这是相应的结构图,按照ai的回答做出,相应的依赖我们能够实现登录以及相应的查询,不过也有一些数据取不到,有一些bug,其他功能代码ai没有给出,需要我们进一步索要,不过也能看出ai是可以用于做项目了

车辆运维管理行业洞察与竞品分析

1. 前言 车辆运维管理是指对车辆进行日常维护、故障处理、性能监测、成本控制等一系列活动的管理。随着物联网、大数据、人工智能等技术的发展,车辆运维管理软件和解决方案的市场竞争日益激烈。 2. 确定目标通过产品差异化定位,找到竞争者的差异,打造自己的优势,抢占市场份…

go语言实现终端里的倒计时

最近在更新系统的时候发现pacman的命令行界面变了,我有很久没更新过设备上的Linux系统了,所以啥时候变的不好说。但这一变化成功勾起了我的好奇心。新版的更新进度界面如下:新的更新进度界面能同时显示多个进度条,而且并没有依靠ncurses这个传统的TUI库。为啥我能断定没有用…

备份是个好习惯

题目环境启动以后页面回显了一行字符串,丢进随波逐流里面以后发现解密不出来,如果有知道的大佬辛苦留言一下没啥思路,想到题目名字叫备份是个好习惯,说不定网页目录下真有bak文件,于是就拿御剑扫描一下扫完以后还真有打开以后就是这样一段代码点击查看代码 接下来就是代码…

使用 Net 处理 Excel 文件的时间列

前言最近,处理Excel的情况比较多,然后,就碰到了时间列,读取出来时中文,保存到数据库中着实麻烦,就找了下如何解决这个问题。正文1.这是读取Excel时候,调试的时候,时间列的格式,如下图:2.分享下原始读取Excel的公共方法,其实,也只能说这个方法写的有问题,所有列都按…

HTB Sherlock Easy Noted wp

靶场介绍:Simon, a developer working at Forela, notified the CERT team about a note that appeared on his desktop. The note claimed that his system had been compromised and that sensitive data from Simons workstation had been collected. The perpetrators per…