SpringBoot自定义线程池
使用SpringBoot构建应用时,如何使用线程处理异步任务?其实springBoot已经提供了默认的实现,通过在启动类上加上注解@EnableAsync, 然后在需要异步处理的方法上增加注解@Async即可启动一个线程进行异步处理。其实质类似于:new Thread(()-{System.out.print("处理异步任务")}).start()。但需要注意的是@Async
1.2 线程池配置属性类MyThreadPoolConfig .java
/** * 线程池配置属性类 */ @ConfigurationProperties(prefix = "mytask.pool") public class MyThreadPoolConfig { private int corePoolSize; private int maxPoolSize; private int keepAliveSeconds; private int queueCapacity; }
@EnableAsync @EnableConfigurationProperties({MyThreadPoolConfig.class}) @SpringCloudApplication public class application { public static void main(String[] args) { SpringApplication.run(application.class, args); } }
/** * 创建线程池 */ @Configuration public class MyTaskExecutePool { @Autowired private MyThreadPoolConfig config; @Bean("myTaskPool") public Executor taskExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); //核心线程池大小 executor.setCorePoolSize(config.getCorePoolSize()); //最大线程数 executor.setMaxPoolSize(config.getMaxPoolSize()); //队列容量 executor.setQueueCapacity(config.getQueueCapacity()); //活跃时间 executor.setKeepAliveSeconds(config.getKeepAliveSeconds()); //线程名字前缀 executor.setThreadNamePrefix("TaskExecutePool-"); // setRejectedExecutionHandler:当pool已经达到maxSize的时候,如何处理新进任务 // CallerRunsPolicy:不在新线程中执行任务,而是由调用者所在的线程来执行 executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); // 等待所有任务结束后再关闭线程池 executor.setWaitForTasksToCompleteOnShutdown(true); executor.initialize(); return executor; } }
需要注意的是这样定义的线程池在使用的时候要在@Async主键里指定名称,如:@Async("mytaskExecutor"), 否则会使用spingtBoot提供的默认线程池。
/** * 重新SpringBoot默认的线程池 */ @Configuration public class OverrideAsyncTaskExecutePool implements AsyncConfigurer{ //注入配置类 @Autowired MyThreadPoolConfig config; @Override public Executor getAsyncExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); //核心线程池大小 executor.setCorePoolSize(config.getCorePoolSize()); //最大线程数 executor.setMaxPoolSize(config.getMaxPoolSize()); //队列容量 executor.setQueueCapacity(config.getQueueCapacity()); //活跃时间 executor.setKeepAliveSeconds(config.getKeepAliveSeconds()); //线程名字前缀 executor.setThreadNamePrefix("MyExecutor-"); // setRejectedExecutionHandler:当pool已经达到max size的时候,如何处理新任务 // CallerRunsPolicy:不在新线程中执行任务,而是由调用者所在的线程来执行 executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); executor.initialize(); return executor; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端