# 灵控自装线程池 **Repository Path**: wgb20250318/DynaGuardAutoPool ## Basic Information - **Project Name**: 灵控自装线程池 - **Description**: 自研线程池,with参数动态配置和监控页面 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2025-08-03 - **Last Updated**: 2025-08-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # DynaGuardAutoPool Logo ## 🚀 项目介绍 DynaGuardAutoPool 是一个高性能、可动态调整的轻量级线程池框架,专为需要精细控制并发任务执行的Java应用程序设计。该框架提供了丰富的线程池管理功能,包括参数动态调整、实时监控和灵活的任务调度策略。 ### 核心功能 - **动态参数调整**:无需重启应用,实时调整核心线程数、最大线程数,甚至是任务队列等参数 - **多队列支持**:可切换不同类型的任务队列(如阻塞队列、优先级队列) - **灵活的拒绝策略**:支持多种任务拒绝策略,并可动态切换 - **实时监控**:通过REST API和WebSocket实时监控线程池状态 - **Spring Boot集成**:与Spring Boot框架无缝集成,支持自动配置 - **轻松扩展**:只需要实现接口就能轻松自定义任务队列、拒绝策略 ## 💡 实现亮点 ### 1. 动态参数调整机制 框架允许在运行时调整线程池的核心参数,包括核心线程数、最大线程数、线程空闲时间等。这些调整会立即生效,无需重启应用。 ### 2. 实时监控系统 通过WebSocket实现了线程池状态的实时推送,客户端可以实时获取线程池的工作状态、任务队列长度等信息。同时提供了REST API用于查询和调整线程池参数。 ### 3. 可插拔的组件设计 - **任务队列**:支持多种队列实现,可根据业务需求动态切换 - **拒绝策略**:提供多种拒绝策略(如CallerRuns、DiscardOldest等),并支持自定义策略 ### 4. 线程生命周期管理 精细控制线程的创建和销毁,支持核心线程的动态调整和非核心线程的自动回收。 ## 📚 使用方法 ### 1. Spring Boot环境集成(test_springboot_integration包就是用来测试springboot集成的) #### 配置文件 在`application.properties`或`application.yml`中添加以下配置: ```properties fy: thread-pool: enabled: true #是否开启线程池自动装配 coreNums: 5 #线程池核心线程数 maxNums: 10 #线程池最大线程数 poolName: yf-thread-pool #线程池名称 threadName: yf-thread #线程名称 isDaemon: true #是否是守护线程 coreDestroy: false #线程池是否销毁 aliveTime: 5 #线程存活时间(单位:s) queueName: linked #队列名称 queueCapacity: #队列容量(不写代表null,为无界) rejectStrategyName: callerRuns #拒绝策略名称 monitor: enabled: true #是否开启监控 fixedDelay: 1000 #后台像前端推送线程状态信息的间隔时间(单位:ms) qReplaceable: true #是否可更换队列 默认是开启的(不写这个key默认开启,写了key后只有value为true才是开启,以下同理) rsReplaceable: true #是否可更换拒绝策略 ``` #### 使用线程池 注入`ThreadPool`实例并使用: ```java @Autowired private ThreadPool threadPool; // 执行任务 threadPool.execute(() -> { // 任务逻辑 }); //如果是使用优先级队列,那么应传入PriorityTask对象能手动指定优先级(数字越大优先级越高),示例: //Runnable r = () -> {}; //任务,返回值 ,优先级 //PriorityTask pt = new PriorityTask(r, null,10); //threadPool.execute(pt); // 提交有返回值的任务 Future future = threadPool.submit(() -> { // 任务逻辑 return result; }); //如果是使用优先级队列,那么应传入PriorityTask对象能手动指定优先级(数字越大优先级越高),示例: //Callable c = () -> {}; //任务,返回值 ,优先级 //PriorityTask pt = new PriorityTask(c,10); //threadPool.execute(pt); ``` ### 2. 监控线程池 #### REST API - 获取线程池信息:`GET /monitor/pool` - 获取队列任务数量:`GET /monitor/tasks` - 调整线程参数:`PUT /monitor/worker` - 切换队列:`PUT /monitor/queue` - 切换拒绝策略:`PUT /monitor/rejectStrategy` #### WebSocket实时监控 连接`/monitor/threads`端点,实时接收线程池状态更新。 ### 端口号处理 为了确保请求能够正确连接到后端服务,建议从配置文件中读取服务器端口号: ```java // 从配置文件中读取端口号 @Value("${server.port:8080}") private int serverPort; // 构建请求URL String baseUrl = "http://localhost:" + serverPort; String apiUrl = baseUrl + "/monitor/pool"; ``` 这种方式会优先使用配置文件中定义的`server.port`,如果没有定义则默认使用8080端口。 ### 3. 非Spring Boot环境使用 ```java // 创建线程工厂 ThreadFactory threadFactory = new ThreadFactory("worker", false, false, 6); 线程名称,是否守护,核心是否摧毁,空闲时间(单位:s) // 创建任务队列 TaskQueue taskQueue = new LinkedBlockingQueue(100); 队列容量,如果为null,则代表无界 // 创建拒绝策略 RejectStrategy rejectStrategy = new CallerRunsStrategy(); // 创建线程池 ThreadPool threadPool = new ThreadPool(5, 20, //核心数量,最大数量 "DynaGuardPool",//线程池名称 threadFactory,//线程工厂 taskQueue,//任务队列 rejectStrategy);//拒绝策略 // 使用线程池 threadPool.execute(() -> { // 任务逻辑 }); threadPool.submit(() -> { // 任务逻辑 }); ``` ## 📝 注意事项 - 确保在生产环境中合理配置线程池参数,避免资源耗尽 - 动态调整参数时,注意核心线程数不能超过最大线程数 - 自定义队列时,需确保线程安全 ## 🔧 开发者扩展说明 ### 自定义任务队列 要实现自定义任务队列,只需继承`TaskQueue`抽象类并实现其抽象方法: ```java // @TaskQueueBean("custom")//springboot环境加上,yml文件配置好队列名称,可实现自动装配 public class CustomQueue extends TaskQueue {//需要保证线程安全,读写锁以及条件变量抽象父类已经提供 private Queue q; public CustomQueue(Integer capacity) { //如果是springboot环境就不要加上这个构造方法,因为容器中没有capacity的bean setCapacity(capacity); } @Override public Boolean addTask(Runnable task) { //添加任务逻辑 } @Override public Runnable poll(Integer waitTime) throws InterruptedException { // 获取任务逻辑 } @Override public Boolean removeTask() { // 移除任务逻辑 } @Override public int getExactTaskNums() { // 获取此时精确任务数量逻辑(需要锁来保证) } @Override public int getTaskNums() { // 获取此时任务数量逻辑(不需要锁来保证) } } ``` 然后,在`OfQueue`常量类中注册你的自定义队列(如果是本项目使用者则无需关注,如果是本项目开发者则需要): ```java public class OfQueue { public final static String CUSTOM = "custom"; // 其他队列类型... static { TASK_QUEUE_MAP.put(LINKED, LinkedBlockingQueue.class); TASK_QUEUE_MAP.put(PRIORITY, PriorityBlockingQueue.class); TASK_QUEUE_MAP.put(CUSTOM, CustomQueue.class); // 注册自定义队列 } } ``` ### 自定义拒绝策略 要实现自定义拒绝策略,只需实现`RejectStrategy`接口: ```java //使用与队列同理 public class CustomRejectStrategy implements RejectStrategy { private ThreadPool threadPool; @Override public void setThreadPool(ThreadPool threadPool) { this.threadPool = threadPool; } @Override public void reject(Runnable task) { // 自定义拒绝逻辑 System.err.println("Custom rejection strategy: Task rejected - " + task); // 例如,可以记录日志、尝试重新提交或执行其他操作 } } ``` 然后,在`OfRejectStrategy`常量类中注册你的自定义拒绝策略: ```java public class OfRejectStrategy { public final static String CUSTOM = "custom"; // 其他拒绝策略... static { REJECT_STRATEGY_MAP.put(CALLER_RUNS, CallerRunsStrategy.class); REJECT_STRATEGY_MAP.put(DISCARD_OLDEST, DiscardOldestStrategy.class); REJECT_STRATEGY_MAP.put(DISCARD, DiscardStrategy.class); REJECT_STRATEGY_MAP.put(CUSTOM, CustomRejectStrategy.class); // 注册自定义拒绝策略 } } ``` ## 📚 技术文档 ### 核心技术实现 #### 1. 线程池核心实现 - **动态参数调整**:通过`ThreadPool`类中的方法实现核心线程数、最大线程数等参数的动态调整 - **线程生命周期管理**:通过`Worker`类中的循环任务和超时机制实现线程的创建和自动回收 - **任务调度**:使用`TaskQueue`接口定义的队列实现任务的存储和调度 #### 2. 并发控制机制 - 使用`ReentrantLock`和`ReadWriteLock`保证线程安全 - 使用`Condition`实现线程间的通信和等待唤醒机制 - 采用精细的锁粒度,避免全局锁带来的性能瓶颈 #### 3. 组件设计模式 - **策略模式**:用于实现不同的拒绝策略和任务队列 - **工厂模式**:通过`ThreadFactory`创建线程 - **观察者模式**:通过WebSocket实现线程池状态的实时推送 #### 4. Spring Boot集成 - 使用`@ConfigurationProperties`和`@AutoConfiguration`实现自动配置 - 通过`@ConditionalOnProperty`和`@Conditional`实现条件装配 - 提供`ThreadPoolProperties`类让用户可以通过配置文件自定义线程池参数 #### 5. 监控系统 - **REST API**:提供HTTP接口用于查询和调整线程池参数 - **WebSocket**:通过`ThreadPoolWebSocketHandler`实现线程池状态的实时推送 - **前端监控界面**:使用HTML、Tailwind CSS和JavaScript实现可视化监控界面(豆包生成的哦) #### 6.未来集成命令行......