SpringBoot中的异步多线程使用及避坑指南

news/2024/4/29 12:04:23/文章来源:https://blog.csdn.net/weixin_45817985/article/details/137110433

SpringBoot中的异步多线程使用及避坑指南
处理请求时需要考虑到系统的性能和响应速度。特别是在处理大量请求或者需要进行耗时操作时,采用异步多线程处理是一种常见的解决方案。Spring Boot提供了@Async注解来支持异步方法调用,结合合适的线程池配置,可以很容易地实现异步多线程处理,提升系统的并发能力和性能。

1.配置线程池

@Configuration
@EnableAsync
public class AsyncConfiguration {@Bean("doSomethingExecutor")public Executor doSomethingExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();// 核心线程数:线程池创建时候初始化的线程数executor.setCorePoolSize(10);// 最大线程数:线程池最大的线程数,只有在缓冲队列满了之后才会申请超过核心线程数的线程executor.setMaxPoolSize(20);// 缓冲队列:用来缓冲执行任务的队列大小executor.setQueueCapacity(500);// 允许线程的空闲时间60秒:当超过了核心线程之外的线程在空闲时间到达之后会被销毁executor.setKeepAliveSeconds(60);executor.setThreadNamePrefix("do-something-");// 缓冲队列满了之后的拒绝策略:由调用线程处理(一般是主线程executor.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardPolicy());executor.initialize();return executor;}
}

在这个配置中,我们使用了ThreadPoolTaskExecutor作为线程池的实现,并且设置了一些关键参数,如核心线程数、最大线程数、缓冲队列大小等。如果不太了解线程池的小伙伴可以看一下之前介绍线程池介绍线程池的核心参数,线程池的执行原理知道

  1. @Async注解
    在需要异步执行的方法上使用@Async注解。这样的方法将会在一个单独的线程中执行,而不会阻塞主线程。
@Slf4j
@Service
public class AsyncService {// 指定使用beanname为doSomethingExecutor的线程池@Async("doSomethingExecutor")public  CompletableFuture<String> doSomething(String message) throws InterruptedException {log.info("doSomethingExecutor thread name  ={}", Thread.currentThread().getName());Thread.sleep(1000);return CompletableFuture.completedFuture(message);}
}

doSomething()方法被标记为异步方法,并且指定了使用名为"doSomethingExecutor"的线程池进行执行。

  1. 异步多结果聚合返回CompletableFuture
    在某些情况下,我们可能需要等待多个异步任务执行完毕后再进行下一步操作,这时可以使用CompletableFuture来实现异步多结果的聚合。
@RestController
@RequestMapping
public class AsyncController {@Autowiredprivate AsyncService asyncService;@GetMapping("/open/somethings")public List<String> somethings() throws InterruptedException {int count = 6;List<CompletableFuture<String>> futures = new ArrayList<>();List<String> results = new ArrayList<>();// 启动多个异步任务,并将 CompletableFuture 对象存储在列表中for (int i = 1; i < count; i++) {CompletableFuture<String> future = asyncService.doSomething("index: "+i);futures.add(future);}for (CompletableFuture<String> future : futures) {String result = future.get(); // 阻塞等待异步任务完成并获取结果results.add(result);}return results;}
}

我们通过循环启动了多个异步任务,将返回的 CompletableFuture 对象存储在列表中。然后,我们再次循环遍历这些 CompletableFuture 对象,并调用 get() 方法来阻塞等待异步任务完成,获取结果。最后,将结果添加到结果列表中并返回

使用浏览器发送http://localhost:8888/open/somethings,结果如下
在这里插入图片描述
@Async注解会在以下几个场景失效,使用了@Async注解,但就没有走多线程:

异步方法使用static关键词修饰;
异步类不是一个Spring容器的bean(一般使用注解@Component和@Service,并且能被Spring扫描到);
SpringBoot应用中没有添加@EnableAsync注解;
在同一个类中,一个方法调用另外一个有@Async注解的方法,注解不会生效。原因是@Async注解的方法,是在代理类中执行的。
异步方法使用注解@Async的返回值只能为void或者Future及其子类,当返回结果为其他类型时,方法还是会异步执行,但是返回值都是null

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_1027912.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQL Server 实验二:数据库视图的创建和使用

目录 第一关 相关知识 什么是表 操作数据表 创建数据表 插入数据 修改表结构 删除数据表 编程要求 第一关实验代码&#xff1a; 第二关 相关知识 视图是什么 视图的优缺点 视图的优点 视图的缺点 操作视图 创建视图 通过视图向基本表中插入数据 通过视图修改基本表的…

是德科技KEYSIGHT E5071C网络分析仪

181/2461/8938产品概述&#xff1a; Keysight E5071C&#xff08;安捷伦&#xff09;网络分析仪提供同类产品中最高的射频性能和最快的速度&#xff0c;并具有宽频率范围和多功能功能。E5071C 是制造和研发工程师评估频率范围高达 20 GHz 的射频元件和电路的理想解决方案。 有…

阿里云2024年优惠券(代金券)领取方法汇总

随着云计算技术的不断发展&#xff0c;阿里云作为国内领先的云服务提供商&#xff0c;为广大用户提供了高效、稳定的云服务。为了回馈用户&#xff0c;阿里云会定期发放各种优惠券&#xff0c;帮助用户节省上云成本。本文将为大家汇总阿里云2024年优惠券的领取方法&#xff0c;…

几种Yolo图像标注工具

Yolo可以识别的标注为txt 1.LabelImg 最常用&#xff0c;但经常莫名其妙地闪退&#xff0c;稳定性差 2.Yolo_Label 我都打算自己写程序了&#xff0c;网上找到了这个工具&#xff0c;看来早有人无法忍受现存的标记工具&#xff0c;自己动手写了个标注工具&#xff0c;比Label…

安防监控视频汇聚平台EasyCVR在银河麒麟V10系统中的启动异常及解决方法

安防监控视频平台EasyCVR具备较强的兼容性&#xff0c;它可以支持国标GB28181、RTSP/Onvif、RTMP&#xff0c;以及厂家的私有协议与SDK&#xff0c;如&#xff1a;海康ehome、海康sdk、大华sdk、宇视sdk、华为sdk、萤石云sdk、乐橙sdk等。平台兼容性强&#xff0c;支持Windows系…

钡铼技术R40工业路由器赋能智慧电网实现远程智能采集数据

在当今的智能化时代&#xff0c;智慧电网作为能源互联网的重要基础设施&#xff0c;其建设和升级离不开先进的通信技术和设备的支持。钡铼技术R40工业路由器凭借其强大的数据传输能力、稳定可靠的性能以及卓越的环境适应性&#xff0c;在赋能智慧电网实现远程智能采集数据方面发…

1. Java概述

文章目录 1.Java语言概述1.1 Java介绍1.1.1 软件开发概述1.1.2 计算机语言1.1.3 Java 简史1.1.4 Java 技术体系平台1.1.5 Java在各领域的应用1.1.6 Java语言特点1.1.7 Java核心机制一-Java虚拟机1.1.8 Java核心机制二-垃圾回收1.1.9 Java开发工具 1.2 Java环境搭建1.2.1 JDK、J…

ElasticSearch理论指导

引子 本文致力于ElasticSearch理论体系构建&#xff0c;从基本概念和术语讲起&#xff0c;具体阐述了倒排索引和TransLog&#xff0c;接着讲了ElasticSearch的增删改查的流程和原理&#xff0c;最后讲了讲集群的选举和脑裂问题。 前言 大碗宽面-Kafka一本道万事通&#xff0…

设计模式-设配器模式

目录 &#x1f38a;1.适配器模式介绍 &#x1f383;2.适配器类型 &#x1f38f;3.接口适配器 &#x1f390;4.类的适配器 &#x1f38e;5.优缺点 1.适配器模式介绍 适配器模式&#xff08;Adapter Pattern&#xff09;是作为两个不兼容的接口之间的桥梁。这种类型的设…

自动化测试 —— Pytest fixture及conftest详解

前言 fixture是在测试函数运行前后&#xff0c;由pytest执行的外壳函数。fixture中的代码可以定制&#xff0c;满足多变的测试需求&#xff0c;包括定义传入测试中的数据集、配置测试前系统的初始状态、为批量测试提供数据源等等。fixture是pytest的精髓所在&#xff0c;类似u…

2-HDFS常用命令及上传下载流程

HDFS NameNode 安全模式(safemode) 当NameNode被重启的时候&#xff0c;自动进入安全模式 在安全模式中&#xff0c;NameNode首先会触发edits_inprogress文件的滚动。滚动完成之后&#xff0c;更新fsimage文件 更新完成之后&#xff0c;NameNode会将fsimage文件中的元数据加…

利用云手机技术,开拓海外社交市场

近年来&#xff0c;随着科技的不断进步&#xff0c;云手机技术逐渐在海外社交营销领域崭露头角。其灵活性、成本效益和全球性特征使其成为海外社交营销的利器。那么&#xff0c;究竟云手机在海外社交营销中扮演了怎样的角色呢&#xff1f; 首先&#xff0c;云手机技术能够消除地…

腾讯云4核8G服务器价格,12M带宽一年646元,送3个月

2024年腾讯云4核8G服务器租用优惠价格&#xff1a;轻量应用服务器4核8G12M带宽646元15个月&#xff0c;CVM云服务器S5实例优惠价格1437.24元买一年送3个月&#xff0c;腾讯云4核8G服务器活动页面 txybk.com/go/txy 活动链接打开如下图&#xff1a; 腾讯云4核8G服务器优惠价格 轻…

Eclipse的基本使用讲解(建项目,建包,建类,写代码(基本语法))新手入门必备

目录 一.介绍eclipse 二.操作Eclipse 1.选择工作空间 2.建项目&#xff0c;建包&#xff0c;建类 1.建项目(两种) 2.建包 3.建类 三.写代码(基本语法) 1.代码操作 2.代码规范 3.代码注释 一.介绍eclipse Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其…

【LeetCode热题100】124.二叉树的最大路径和(二叉树)

一.题目要求 二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点&#xff0c;且不一定经过根节点。 路径和 是路径中各节点值的总和。 给你一个二叉树的根节点 root …

Qt打印系统库的日志 - QLoggingCategory

Qt的动态库通过源码可以可以看到含有大量的qCInfo 和 qCDebug 等大量的日志&#xff0c; 但是我们正常运行Qt程序&#xff0c;这些动态库或插件里面的日志是不会输出到我们的控制台里面的。 所以本章主要记录怎么输出这些日志出来。 一&#xff1a; 步骤 主要使用的是Qt的 函…

macOS 13 Ventura (苹果最新系统) v13.6.6正式版

macOS 13 Ventura是苹果电脑的全新操作系统&#xff0c;它为用户带来了众多引人注目的新功能和改进。该系统加强了FaceTime和视频通话的体验&#xff0c;同时优化了邮件、Safari浏览器和日历等内置应用程序&#xff0c;使其更加流畅、快速和安全。特别值得一提的是&#xff0c;…

基于51单片机的客车汽车安全气囊控制器Proteus仿真

地址&#xff1a;https://pan.baidu.com/s/10enj1EYm_0Z8f_19Sz_eCQ 提取码&#xff1a;1234 仿真图&#xff1a; 芯片/模块的特点&#xff1a; AT89C52简介&#xff1a; AT89C52是一款经典的8位单片机&#xff0c;是意法半导体&#xff08;STMicroelectronics&#xff09;公…

[创建型模型] 原型模式

一 介绍 原型设计模式&#xff0c;允许通过复制已有对象的实例&#xff0c;来创建新的对象&#xff0c;并且不需要显示的实例化过程。 目的是通过复制现有对象来创建新对象&#xff0c;从而减少了对象的实例化开销。(避免了一些数据的初始化,读取,加载数据&#xff0c;资源的…

原生 HTML/CSS/JS 实现右键菜单和二级菜单

文章来源&#xff1a;www.huhailong.vip 站点 文章源地址&#xff1a;https://www.huhailong.vip/article/1764653112011841538 Demo效果演示地址 先看效果图 {{{width“auto” height“auto”}}} 需要注意的就是边界检测处理&#xff0c;到极端点击底部和右侧时如果不做处理会…