首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

SpringBoot 整合线程池

编程知识
2024年08月14日 09:46

分为三步

  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
}
From:https://www.cnblogs.com/GilbertDu/p/18358419
本文地址: http://www.shuzixingkong.net/article/1082
0评论
提交 加载更多评论
其他文章 深入理解微服务中的负载均衡算法与配置策略
今天,我们主要补充了上一章关于微服务通信的内容,并深入探讨了负载均衡算法的重要性。我们首先详细讨论了Ribbon默认使用的负载均衡算法。尽管在本地测试时可能会观察到轮询的效果,但简单依赖这种表面的观察是不够的。在真实的生产环境中,特别是在跨多个数据中心部署时,负载均衡策略的选择需要更加深入的理解和分
深入理解微服务中的负载均衡算法与配置策略 深入理解微服务中的负载均衡算法与配置策略
神经网络之卷积篇:详解卷积步长(Strided convolutions)
详解卷积步长 卷积中的步幅是另一个构建卷积神经网络的基本操作,让向展示一个例子。 如果想用3×3的过滤器卷积这个7×7的图像,和之前不同的是,把步幅设置成了2。还和之前一样取左上方的3×3区域的元素的乘积,再加起来,最后结果为91。 只是之前移动蓝框的步长是1,现在移动
神经网络之卷积篇:详解卷积步长(Strided convolutions) 神经网络之卷积篇:详解卷积步长(Strided convolutions) 神经网络之卷积篇:详解卷积步长(Strided convolutions)
数据结构之链表超详解(1)
一人 我饮酒醉醉把佳人成双对两眼 是独相随只求他日能双归娇女 我轻扶琴燕嬉 我紫竹林痴情红颜 心甘情愿千里把你寻说红颜 我痴情笑曲动 我琴声妙轻狂高傲 懵懂无知只怪太年少弃江山 我忘天下斩断情丝无牵挂千古留名传佳话我两年征战已白发一生征战何人陪谁是谁非谁相随戎马一生为了谁我能爱几回恨几回败帝王 斗苍
数据结构之链表超详解(1) 数据结构之链表超详解(1) 数据结构之链表超详解(1)
【动画进阶】神奇的卡片 Hover 效果与 Blur 的特性探究
本文,我们将一起探讨探讨,如下所示的一个卡片 Hover 动画,应该如何实现: 这个效果的几个难点: 鼠标移动的过程中,展示当前卡片边缘的 border 以及发光效果; 效果只出现在鼠标附近?这一块的实现方法就有很多种了,可以计算鼠标附近的范围,在范围内去实现的效果,但是这样成本太高了。 转换一下思
【动画进阶】神奇的卡片 Hover 效果与 Blur 的特性探究 【动画进阶】神奇的卡片 Hover 效果与 Blur 的特性探究 【动画进阶】神奇的卡片 Hover 效果与 Blur 的特性探究
聊一聊 Netty 数据搬运工 ByteBuf 体系的设计与实现
本文基于 Netty 4.1.56.Final 版本进行讨论 时光芿苒,岁月如梭,好久没有给大家更新 Netty 相关的文章了,在断更 Netty 的这段日子里,笔者一直在持续更新 Linux 内存管理相关的文章 ,目前为止,算是将 Linux 内存管理子系统相关的主干源码较为完整的给大家呈现了出来
聊一聊 Netty 数据搬运工 ByteBuf 体系的设计与实现 聊一聊 Netty 数据搬运工 ByteBuf 体系的设计与实现 聊一聊 Netty 数据搬运工 ByteBuf 体系的设计与实现
.NET 8 中利用 MediatR 实现高效消息传递
前言 MediatR 是 .NET 下的一个实现消息传递的库,轻量级、简洁高效,用于实现进程内的消息传递机制。它基于中介者设计模式,支持请求/响应、命令、查询、通知和事件等多种消息传递模式。通过泛型支持,MediatR 可以智能地调度不同类型的消息,非常适合用于领域事件处理。 在本文中,将通过一个简
.NET 8 中利用 MediatR 实现高效消息传递 .NET 8 中利用 MediatR 实现高效消息传递 .NET 8 中利用 MediatR 实现高效消息传递
Sy.ExpressionBuilder 动态查询新体验
省流模式,看下对比 //常规查询 var query = users .WhereIf(m => m.UserName.Contains(input.UserName), !string.IsNullOrEmpty(input.UserName)) .WhereIf(m => input
Sy.ExpressionBuilder 动态查询新体验 Sy.ExpressionBuilder 动态查询新体验 Sy.ExpressionBuilder 动态查询新体验
面试官:说说volatile应用和实现原理?
volatile 是并发编程中的重要关键字,它的名气甚至是可以与 synchronized、ReentrantLock 等齐名,也是属于并发编程五杰之一。 需要注意的是 volatile 并不能保证原子性,因此使用 volatile 并没有办法保证线程安全。 并发编程五杰: PS:“并发编程五杰”是
面试官:说说volatile应用和实现原理? 面试官:说说volatile应用和实现原理?