📖 本章预览
本章为预览版本,展示部分核心内容。完整内容包含详细源码解析、实战代码和面试要点,加入知识星球即可解锁全部章节。
第五章:不改一行代码就能给线程池加功能的黑魔法 — AwareManager 责任链
本章目标:理解 AwareManager 如何用责任链模式把增强逻辑从 DtpExecutor 中解耦出来,掌握 6 个生命周期增强点的源码细节,学会通过 SPI 自定义 Aware。
5.1 设计动机
线程池任务执行有明确的生命周期:提交 → 执行前 → 执行中 → 执行后 → 拒绝 → 关闭 → 终止。
框架需要在每个节点做增强:性能统计、超时检测、拒绝告警。如果把这些逻辑全写在 DtpExecutor 里,会有两个问题:
- DtpExecutor 代码膨胀,职责不单一
- 用户想加自定义增强逻辑时,必须改框架源码
AwareManager 的解法:把每个增强功能封装成独立的 Aware,用责任链串起来。DtpExecutor 只需要在钩子方法里调一行 AwareManager.xxx(),具体做什么由链上的 Aware 决定。
5.2 ExecutorAware 接口
public interface ExecutorAware extends DtpAware {
int getOrder(); // 执行顺序,数字越小越先执行
String getName(); // Aware 名称,用于配置过滤
// ===== 注册/刷新/移除 =====
default void register(ExecutorWrapper wrapper) { }
default void refresh(ExecutorWrapper wrapper, TpExecutorProps props) { }
default void remove(ExecutorWrapper wrapper) { }
// ===== 任务生命周期钩子 =====
default void execute(Executor executor, Runnable r) { }
default void beforeExecute(Executor executor, Thread t, Runnable r) { }
default void afterExecute(Executor executor, Runnable r, Throwable t) { }
// ===== Wrap 变体(支持替换 Runnable)=====
default Runnable beforeExecuteWrap(Executor executor, Thread t, Runnable r) {
beforeExecute(executor, t, r);
return r; // 返回值传给下一个 Aware,支持任务替换
}
// ===== 拒绝钩子 =====
default void beforeReject(Runnable r, Executor executor) { }
default void afterReject(Runnable r, Executor executor) { }
// ===== 关闭钩子 =====
default void shutdown(Executor executor) { }
default void terminated(Executor executor) { }
}
设计要点:
- 全部
default方法,子类只覆盖关心的钩子,其余自动跳过 beforeExecuteWrap返回 Runnable,链上的 Aware 可以替换任务引用getOrder()控制执行顺序,getName()用于配置级别的过滤
5.3 AwareManager 责任链
静态初始化
public class AwareManager {
private static final List<ExecutorAware> EXECUTOR_AWARE_LIST =
new ArrayList<>();
static {
// 内置 3 个 Aware
EXECUTOR_AWARE_LIST.add(new PerformanceMonitorAware()); // order=1
EXECUTOR_AWARE_LIST.add(new TaskTimeoutAware()); // order=2
EXECUTOR_AWARE_LIST.add(new TaskRejectAware()); // order=3
// SPI 加载用户自定义 Aware
List<ExecutorAware> serviceLoader =
ExtensionServiceLoader.get(ExecutorAware.class);
EXECUTOR_AWARE_LIST.addAll(serviceLoader);
// 按 order 排序
EXECUTOR_AWARE_LIST.sort(
Comparator.comparingInt(ExecutorAware::getOrder));
}
}
内置 Aware 的执行顺序:
| Aware | order | 职责 |
|---|---|---|
| PerformanceMonitorAware | 1 | 性能统计(TPS、TP99) |
| TaskTimeoutAware | 2 | 排队超时 + 执行超时检测 |
| TaskRejectAware | 3 | 拒绝计数 + 告警通知 |
| 用户自定义 Aware | 自定义 | SPI 扩展 |
🔒 解锁完整内容
本章剩余内容需要解锁后查看
以上仅为本章部分预览内容,完整内容包含更多深度源码解析、实战代码和面试要点。
加入知识星球你将获得:
- ✅ 全部 12 章完整内容 + 持续更新
- ✅ 配套源码 + 实战项目
- ✅ 一对一答疑 + 面试辅导
- ✅ 简历优化 + 内推机会
📚 本章完整目录
以下为本章完整目录结构,加入知识星球即可解锁全部内容。