SpringBoot 整合线程池

分为三步

  1. 启动类加 @EnableAsync 注解

  2. 在方法上加 @Async 注解

  3. 创建线程池配置类

1.启动类加 @EnableAsync 注解

@SpringBootApplication
@EnableAsync
public class FacadeH5Application {
    public static void main(String[] args) {
        SpringApplication.run(FacadeH5Application.class, args);
    }
}

2.在方法上加 @Async 注解

@Async
public void m1() {
    //do something
}

注意:导致 @Async 注解失效的几个原因

  1. 两个方法都在同一个类里面,一个方法调用另一个异步方法,不生效。但是如果在本类中注入自己的实例,再通过自己的实例调用异步方法就可行。

  2. @Async 方法所在的类没有交给 spring 代理(没加诸如@Component注解),不生效。

  3. 注解的方法不是是public方法,不生效。

3.创建线程池配置类

默认的线程池配置如下

# 核心线程数
spring.task.execution.pool.core-size=8  
# 最大线程数
spring.task.execution.pool.max-size=16
# 空闲线程存活时间
spring.task.execution.pool.keep-alive=60s
# 是否允许核心线程超时
spring.task.execution.pool.allow-core-thread-timeout=true
# 线程队列数量
spring.task.execution.pool.queue-capacity=100
# 线程关闭等待
spring.task.execution.shutdown.await-termination=false
spring.task.execution.shutdown.await-termination-period=
# 线程名称前缀
spring.task.execution.thread-name-prefix=task-

创建线程池配置类

@Configuration
public class ThreadPoolConfig {
    @Bean
    public TaskExecutor taskExecutor(){
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        //设置核心线程数
        executor.setCorePoolSize(10);
        //设置最大线程数
        executor.setMaxPoolSize(20);
        //设置队列容量
        executor.setQueueCapacity(20);
        //设置线程活跃时间
        executor.setKeepAliveSeconds(30);
        //设置线程名称前缀
        executor.setThreadNamePrefix("sendSms-");
        //设置拒绝策略
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        //等待所有任务结束后再关闭线程池
        executor.setWaitForTasksToCompleteOnShutdown(true);
        //设置线程池中任务的等待时间
        executor.setAwaitTerminationSeconds(60);

        return executor;
    }
}

配置多个线程池

有时候,一个项目中如果配置了多个线程池,那需要在 @Bean后面加上线程池的名称

@Configuration
public class ThreadPoolConfig {
    @Bean("ThreadPool1")
    public TaskExecutor taskExecutor(){
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
		......
        return executor;
    }
    @Bean("ThreadPool2")
    public TaskExecutor taskExecutor(){
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
		......
        return executor;
    }
}

在使用 @Async注解时就需要指明具体使用的线程池,如下格式

@Async("ThreadPool1")
public void m1() {
    //do something
}

文章转载自:救苦救难韩天尊

原文链接:https://www.cnblogs.com/GilbertDu/p/18358419

体验地址:引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值