Spring Boot 配置和使用多线程池的实现
作者:阿懒土灵 发布时间:2022-09-04 19:53:02
标签:Spring,Boot,多线程池
某些情况下,我们需要在项目中对多种任务分配不同的线程池进行执行。从而通过监控不同的线程池来控制不同的任务。为了达到这个目的,需要在项目中配置多线程池。
spring boot 提供了简单高效的线程池配置和使用方案。
配置
首先是配置线程池的bean交给spring 管理:
@Configuration
public class TaskExecutePool {
@Bean(name ="threadPoolA")
public ThreadPoolTaskExecutormyTaskAsyncPool() {
ThreadPoolTaskExecutor executor =new ThreadPoolTaskExecutor();
executor.setCorePoolSize(4);
executor.setMaxPoolSize(8);
executor.setQueueCapacity(100);
executor.setKeepAliveSeconds(60);
executor.setThreadNamePrefix("Pool-A");
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.initialize();
return executor;
}
@Bean(name ="ThreadPoolB")
public ThreadPoolTaskExecutorAsyncPoolB() {
ThreadPoolTaskExecutor executor =new ThreadPoolTaskExecutor();
executor.setCorePoolSize(2);
executor.setMaxPoolSize(4);
executor.setQueueCapacity(8);
executor.setKeepAliveSeconds(60);
executor.setThreadNamePrefix("Pool-B");
//当任务数量超过MaxPoolSize和QueueCapacity时使用的策略,该策略是又调用任务的线程执行
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.initialize();
return executor;
}
}
使用
使用线程只需要在执行方法上加上注释,同时该方法的类必须被定义为bean,交由spring管理。
可以在类上使用注解@Component、@Service等
@Async(value="ThreadPoolA")
public void taskA(){
...
}
查看线程活跃数:
@Autowired
private ThreadPoolTaskExecutor threadPoolA;//变量名称为定义的线程池bean定义的name属性名。
public void checkAvtiveThreadNum() {
int num = threadPoolA.getActiveCount();
}
当然还有其他一些方法,这里不再举例。
线程池各属性理解:
corePoolSize:表示线程池核心线程,正常情况下开启的线程数量。
queueCapacity:当核心线程都在跑任务,还有多余的任务会存到此处。
maxPoolSize:如果queueCapacity存满了,还有任务就会启动更多的线程,直到线程数达到maxPoolSize。如果还有任务,则根据拒绝策略进行处理。
拒绝策略有多种:
由任务调用线程执行
抛异常
多余的直接抛弃
根据FIFO(先进先出)抛弃队列里任务
来源:https://www.jianshu.com/p/0170d71dc502


猜你喜欢
- 开篇Mybatis有个实用的功能就是逆向工程,能根据表结构反向生成实体类,这样能避免手工生成出错。市面上的教程大多都很老了,大部分都是针对m
- 首先我们要明白一下几点,1.代码写出来除了让他跑起来还有个非常非常重要的作用是维护,因为没有一成不变的代码,需求变化代码就不可避免的要变化。
- 摘要本文主要介绍基于SpringBoot定时任务ScheduledTaskRegistrar的动态扩展,实现定时任务的动态新增和删除。Sch
- 前言在日常开发中,除了修改请求参数、设置响应header,响应body外,还有一种需求就是url重新,或者是修改url,这里简述一下怎么在z
- 先说一下对异步和同步的理解:同步调用:调用方在调用过程中,持续等待返回结果。异步调用:调用方在调用过程中,不直接等待返回结果,而是执行其他任
- 1、简介对于数据访问层,无论是SQL(关系型数据库) 还是NOSQL(非关系型数据库),SpringBoot 底层都是采用 SpringDa
- 情况一:配置文件,无法被导出或者生效修改前:修改后:究其原因,这是由于Maven的约定大于配置,导致我们写的配置文件,无法被导出或者生效的问
- 这篇文章主要介绍了如何使用Jenkins编译并打包SpringCloud微服务目录,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有
- 可能也有其他方法,比如用 WGet 等等,但是 推荐用 PowerShell ,为什么呢,因为 PowerShell 太强大呗PowerSh
- 一、常用功能java.utils.Collections是集合工具类,用来对集合进行操作。部分方法如下:public static <
- package com.action.android_test;import android.location.Location;impor
- 经过很多查看在巨人的肩膀上写完这篇博客,如有雷同纯属巧合,虽然自己也查了些文章才总结的,但是站在巨人肩膀上不敢搞原创!学习使用一些插件,可以
- 一、C语言中的变量属性C语言中的变量可以有自己的属性在定义变量的时候可以加上“属性”关键字"
- 本文实例为大家分享了Android实现简单点赞动画的具体代码,供大家参考,具体内容如下思路1、找到Activity中DecorView的Ro
- 我们今天来聊下如何做实时通讯(先给知识点,实现原理,最后给出实现实时通信的具体代码--使用工具 android studio)现在先说下用到
- 前言之前写过 Mybatis Plus 的基本配置和使用。Mybatis-Plus 看这一篇就够了当初在进行查询时,虽然没有写硬SQL进行查
- 在Java世界中,AES、DES加密解密需要使用Cipher对象构建加密解密系统,Hutool中对这一对象做再包装,简化了加密解密过程。介绍
- 利用AsyncQueryHandler能异步任务获取手机联系人,增加用户体验,使用起来也很方便。不多说,上干货。布局文件main.xml&l
- 本文实例为大家分享了Android实现加载对话框的具体代码,供大家参考,具体内容如下这里简单说一下两种实现加载对话框的方式:1.使用动画让一
- 这一篇文章涵盖了将 Shiro 集成到基于 Spring 的应用程序的方法。Shiro 的 Java Bean兼容性使它非常适合通过 Spr