06小节:自定义动态线程池基础类
作者:程序员马丁
热门项目实战社群,收获国内众多知名公司面试青睐,近千名同学面试成功!助力你在校招或社招上拿个offer。
自定义动态线程池基础类,元数据信息:
- 什么是线程池oneThread:https://t.zsxq.com/5GfrN
- 代码仓库:https://gitcode.net/nageoffer/onethread —— 申请项目权限参考上述线程池项目链接
- 章节难度:★★☆☆☆ - 中等
- 视频地址:本章节内容简单,无
©版权所有 - 拿个offer-开源&项目实战星球专属学习项目,依据《中华人民共和国著作权法实施条例》和《知识星球产权保护》,严禁未经本项目原作者明确书面授权擅自分享至 GitHub、Gitee 等任何开放平台。违者将面临法律追究。
内容摘要:核心设计的提前规划与整体构思,是构建高质量动态线程池框架的基石,能够有效避免后期大幅返工,同时为系统的灵活扩展和维护奠定坚实基础。
课程目录如下所示:
- 核心设计概述
- 关键类详解
- Builder 设计模式
- 文末总结
核心设计概览
1. 设计思想
在上一篇文章中,我们已经初步了解了我在设计基础组件库时秉持的核心理念:尽可能减少对三方框架的依赖。
秉持这一设计思路,在最初开发 oneThread
框架时,我将大部分与第三方框架无关的通用逻辑,统一抽象封装在了 onethread-core
模块中。
该模块主要承担以下核心职责:
- 定义动态线程池的基础抽象类;
- 执行线程池运行时的告警扫描逻辑;
- 提供线程池运行状态的指标采集能力;
- 支持监听配置中心变更,并动态调整线程池参数及触发告警通知。
下面是 onethread-core
模块的 pom.xml
依赖,可以看到它并未强制依赖任何 Spring 相关的包,保持了良好的独立性和可移植性:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.nageoffer.onethread</groupId>
<artifactId>onethread-all</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>onethread-core</artifactId>
<dependencies>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
</dependency>
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-core</artifactId>
</dependency>
</dependencies>
</project>
有同学可能会疑惑:为什么上述依赖中没有显式指定版本号?
这是因为我们在项目的根目录(通常是 parent
项目的 pom.xml
)中,已经通过 <dependencyManagement>
统一定义了各依赖的版本号。因此,在 onethread-core
模块中只需声明依赖的坐标,无需重复 指定版本,Maven 会自动从父模块继承对应的版本信息。这样不仅提高了依赖管理的统一性,也有助于减少版本冲突风险。
<properties>
<java.version>17</java.version>
<spring-boot.version>3.0.7</spring-boot.version>
<spring-cloud.version>2022.0.3</spring-cloud.version>
<spring-cloud-alibaba.version>2022.0.0.0-RC2</spring-cloud-alibaba.version>
<hutool-all.version>5.8.37</hutool-all.version>
<apollo-client-config-data.version>2.4.0</apollo-client-config-data.version>
<fastjson2.version>2.0.57</fastjson2.version>
<spotless-maven-plugin.version>2.22.1</spotless-maven-plugin.version>
<maven-compiler-plugin.version>3.6.1</maven-compiler-plugin.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>${hutool-all.version}</version>
</dependency>
<dependency>
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-client-config-data</artifactId>
<version>${apollo-client-config-data.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>${fastjson2.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
2. package 说明
在前面的文章中,我们已经介绍过 oneThread
框架中各个模块(Module)所承担的职责。但当时并未展开到更细粒度的 package 层级结构。
本文将进一步说明 onethread-core
模块中各个包的具体作用,帮助大家更清晰地理解其内部结构与设计意图。
具体包划分与功能如下所示:
.
├── src
│ ├── main
│ │ └── java
│ │ └── com
│ │ └── nageoffer
│ │ └── onethread
│ │ └── core
│ │ ├── alarm # 告警扫描
│ │ ├── config # 组件库基础配置
│ │ ├── constant # 常量类
│ │ ├── executor # 最最核心的线程池基础包
│ │ │ └── support # 核心基础包至上增强的功能,如果不拆分这个也行,但是类会比较多
│ │ ├── monitor # 运行时指标监控
│ │ ├── notification # 线程池配置变更和告警通知
│ │ │ ├── dto
│ │ │ └── service
│ │ ├── parser # 解析配置内容字符串为键值对 Map
│ │ └── toolkit # 工具包,比如:线程池和线程工厂构建者
大家最需要关注的是 alarm、executor、monitor、notification 四个包。