Spring Boot 自定义线程池
1. 编写配置类
在 xiaohashu-auth 认证服务中的 /config 包下,新建 ThreadPoolConfig 线程池配置类,代码如下:
package com.quanxiaoha.xiaohashu.auth.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;
/**
* @author: 犬小哈
* @date: 2024/5/23 15:40
* @version: v1.0.0
* @description: 自定义线程池
**/
@Configuration
public class ThreadPoolConfig {
@Bean(name = "taskExecutor")
public Executor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
// 核心线程数
executor.setCorePoolSize(10);
// 最大线程数
executor.setMaxPoolSize(50);
// 队列容量
executor.setQueueCapacity(200);
// 线程活跃时间(秒)
executor.setKeepAliveSeconds(30);
// 线程名前缀
executor.setThreadNamePrefix("AuthExecutor-");
// 拒绝策略:由调用线程处理(一般为主线程)
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
// 等待所有任务结束后再关闭线程池
executor.setWaitForTasksToCompleteOnShutdown(true);
// 设置等待时间,如果超过这个时间还没有销毁就强制销毁,以确保应用最后能够被关闭,而不是被没有完成的任务阻塞
executor.setAwaitTerminationSeconds(60);
executor.initialize();
return executor;
}
}
解释一下每行的代码的作用:
这段代码是用来配置和初始化一个线程池任务执行器 (
ThreadPoolTaskExecutor) 的。在 Spring Boot 应用中,线程池可以用来处理并发任务,尤其是需要执行大量异步任务时,可以提高系统的响应速度和吞吐量。ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
- 创建一个
ThreadPoolTaskExecutor实例。ThreadPoolTaskExecutor是 Spring 提供的一个方便的线程池封装类,基于 JDK 的ThreadPoolExecutor实现。executor.setCorePoolSize(10);
- 设置核心线程池的大小。核心线程池的线程数是线程池的基本大小,这些线程会一直存在,即使它们处于空闲状态。这里设置为 10,意味着最少会有 10 个线程一直存活。
executor.setMaxPoolSize(50);
- 设置线程池最大线程数。这个值表示线程池中允许创建的最大线程数。当核心线程池的线程都在忙时,会创建新的线程来处理任务,但不会超过这个最大值。这里设置为 50。
executor.setQueueCapacity(200);
- 设置队列的容量。任务队列用于保存等待执行的任务。这里设置为 200,意味着如果所有核心线程都在工作,新任务会被放在这个队列中等待执行,直到队列满为止。
executor.setKeepAliveSeconds(30);
- 设置线程的空闲时间。当线程池中线程数大于核心线程数时,多余的空闲线程的存活时间,超过这个时间会被销毁。这里设置为 30 秒。
executor.setThreadNamePrefix("AuthExecutor-");
- 设置线程名称的前缀。设置后,线程池中的线程名称会以这个前缀开头,便于在调试和监控时识别这些线程。
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
- 设置拒绝策略。当线程池达到最大线程数并且队列已满时,任务会被拒绝。
CallerRunsPolicy是一种拒绝策略,它会将任务返回给调用者线程执行,避免任务丢失。executor.setWaitForTasksToCompleteOnShutdown(true);
- 设置线程池在关闭时是否等待所有任务完成。设置为
true,意味着线程池会等待所有任务完成再关闭。executor.setAwaitTerminationSeconds(60);
- 设置线程池在关闭时等待任务完成的最大时间。这里设置为 60 秒,超过这个时间后,线程池会强制关闭,即使有任务未完成。
executor.initialize();
- 初始化线程池。必须调用此方法才能使配置生效并启动线程池。
2. 测试一波
自定义线程池配置类添加完毕后,创建一个名为 ThreadPoolTaskExecutorTests 的单元测试类,代码如下:
package com.quanxiaoha.xiaohashu.auth;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
/**
* @author: 犬小哈
* @date: 2024/5/23 15:56
* @version: v1.0.0
* @description: TODO
**/
@SpringBootTest
@Slf4j
public class ThreadPoolTaskExecutorTests {
@Resource
private ThreadPoolTaskExecutor threadPoolTaskExecutor;
/**
* 测试线程池
*/
@Test
void testSubmit() {
threadPoolTaskExecutor.submit(() -> log.info("异步线程中说: 犬小哈专栏"));
}
}
解释一下:
- 注入
ThreadPoolTaskExecutor类,注意别导错类了,该类的包路径为org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;- 在单元测试方法中,异步打印一行日志;
运行该单元测试,观察控制台日志,可以看到成功打印了对应的日志,同时,该线程名为 AuthExecutor-1 , 说明自定义的异步线程池工作正常:

浙公网安备 33010602011771号