Spring Boot 自定义线程池

1. 编写配置类

img

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 实例。ThreadPoolTaskExecutorSpring 提供的一个方便的线程池封装类,基于 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. 测试一波

img

自定义线程池配置类添加完毕后,创建一个名为 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 , 说明自定义的异步线程池工作正常:

posted @ 2025-08-19 08:40  一人一口粥  阅读(7)  评论(0)    收藏  举报
|