SpringBoot 线程池配置和异步任务调用

本文详细介绍了如何在SpringBoot中重写默认线程池,包括相关参数配置、线程池配置注入,探讨了线程池的拒绝策略,并提供了任务Task的编写方法及异步调用的实现步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

方式一:重写spring默认线程池的方式

1、相关参数配置

#线程相关配置
#核心线程数
task.pool.corePoolSize: 5
#线程池最大线程数
task.pool.maxPoolSize: 20
#线程最大空闲时间
task.pool.keepAliveSeconds: 300
#队列最大容量
task.pool.queueCapacity: 50
#线程名称前缀
task.pool.threadPrefix: pcv-excutor-

2、重写Spring线程池 配置注入

import lombok.extern.slf4j.Slf4j;
import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.aop.interceptor.SimpleAsyncUncaughtExceptionHandler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPo
### Spring Boot 自定义线程池配置异步任务使用 #### 一、基本概念介绍 在Spring Boot中,`ThreadPoolTaskExecutor`被提供作为默认的线程池实现[^1]。为了更灵活地控制应用中的并发行为,可以创建并配置自己的线程池。 对于希望标记为异步执行的方法,则可以通过添加`@Async`注解来达成目的;需要注意的是,在项目启动类或任意配置类上需启用异步支持即加上`@EnableAsync`注解才能使此功能生效[^4]。 #### 二、自定义线程池配置方式 一种常见的做法是在应用程序内通过继承`AsyncConfigurer`接口来自定义线程池设置[^3]: ```java @Configuration @EnableAsync public class AsyncConfig implements AsyncConfigurer { @Override public Executor getAsyncExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); // 设置核心线程数 executor.setCorePoolSize(5); // 设置最大线程数 executor.setMaxPoolSize(10); // 设置队列容量 executor.setQueueCapacity(25); // 初始化线程池 executor.initialize(); return executor; } } ``` 上述代码片段展示了如何基于`ThreadPoolTaskExecutor`构建一个具有特定参数设定(比如核心/最大线程数量以及等待队列大小)的线程池实例,并将其注册到Spring容器以便后续调用。 #### 三、编写异步服务方法 一旦完成了线程池的基础搭建工作之后,便可以在业务逻辑层面上利用这些资源了。下面给出一段简单的例子说明怎样声明一个能够异步运行的服务函数[^2]: ```java @Service public class AsyncTaskService { @Async public void executeAsyncTask(Integer i) throws InterruptedException{ System.out.println( "Start async task at:" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) ); Thread.sleep(i * 1000L); // Simulate delay with sleep. System.out.println( "End async task at:" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) ); } } ``` 这里的关键在于给目标方法打上了`@Async`标签,这表明当有客户端请求触发这个操作时,它将会在线程池里新开辟出来的子进程中完成而不是阻塞住主线程继续往下走。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值