当前位置: 首页 > news >正文

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 {@Beanpublic 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
}

http://www.mrgr.cn/news/181.html

相关文章:

  • [每周一更]-(第110期):QT开发最佳实战(php/go/python/javascript)
  • Webpack 打包性能优化指南
  • C:每日一练:单身狗(2.0版本)
  • 盲盒抽奖源码
  • 【数据结构】使用C语言建立邻接矩阵表示有向图
  • 【Redis】Redis典型应用-缓存(cache)
  • 超精细CG杰作:8K壁纸级官方艺术插画,展现极致美丽与细节的汉服女孩
  • 打卡学习Python爬虫第三天|电影天堂案例
  • 美团笔试-测试方向
  • html+css网页设计 淘宝登录页面
  • Docker 日志管理
  • Go Channel 详解
  • docker 部署 遇到的一些问题
  • Redis 哈希(Hash)
  • leetcode108.把升序数组转换成二叉搜索树
  • 【速览】数据库-MySQL(更新中)
  • 百度AI智能云依赖库OpenSSL库和Curl库及jsoncpp库安装
  • ArcGIS Pro 实现人口分布栅格TIFF数据的网格提取与可视化
  • [C/C++] 基本数据类型
  • HTML常用标签和CSS的运用,以及使用HTML做一个简历