spring boot 中的异步@Async
spring boot 开启异步调用
1、启动类上添加@EnableAsync注解,表示启动异步
2、在具体实现异步的方法上添加@Async注解
package com.example.demo;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;@SpringBootApplication
@EnableAsync
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}}
package com.example.demo;import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;/*** @Description: TODO* @author: sl* @date: 2024年05月30日 21:55*/
@Component
public class DemoController {/*** Async相当于是方法级别的线程,本身没有自定义线程池更加灵活* 相当于是每进来一个请求就开启一个线程,超过核心线程数小于最大线程数放入队列,* 队列满了,继续创建线程直至达到最大线程数* @throws InterruptedException*/@Asyncpublic void testSync() throws InterruptedException {Thread.sleep(2000);System.out.println("异步执行成功");}
}
测试执行
package com.example.demo;import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
class DemoApplicationTests {@Autowiredprivate DemoController demoController;@Testvoid contextLoads() throws InterruptedException {demoController.testSync();System.out.println("主线程执行");Thread.sleep(4000);}}
执行结果

执行原理
SpringBoot会默创建了一个线程池,使用这里面的线程来执行异步调用,在项目中使用
手动创建线程池异步调用
常用线程池创建以及弊端
Executors 是一个 Java 中的工具类。提供四种线程池创建方式,工厂方法来创建不同类型的线程池。Executors 的创建线程池的方法,创建出来的线程池都实现了ExecutorService 接口,
1.newFiexedThreadPool(int Threads):创建固定数目线程的线程池。
2.newCachedThreadPool():创建一个可缓存的线程池,调用 execute将重用以前构造的线程(如果线程可用)。如果没有可用的线程,则创建一个新线程并添加到池中。终止并从缓存中移除那些已有 60 秒钟未被使用的线程。
3.newSingleThreadExecutor() 创建一个单线程化的 Executor。
4.newScheduledThreadPool(int corePoolSize) 创建一个支持定时及周期性的任务执行的线程池,多数情况下可用来替代 Timer 类不建议大家使用Executors这个类来创建线程池呢,阿里开发手册这样定义:
【强制】线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式Executors 返回的线程池对象的弊端如下:
1) FixedThreadPool 和 SingleThreadPool:
允许的请求队列长度为 Integer.MAX_VALUE,可能会堆积大量的请求,从而导致 OOM
2) CachedThreadPool 和 ScheduledThreadPool:
允许的创建线程数量为 Integer.MAX_VALUE, 可能会创建大量的线程,从而导致 OOM
使用常见的三种线程池创建方式,单一、可变、定长都有一定问题,原因是 FixedThreadPool 和 SingleThreadExecutor 底层都是用LinkedBlockingQueue 实现的,这个队列最大长度为 Integer.MAX_VALUE,容易导致 OOM
所以实际生产一般自己通过 ThreadPoolExecutor 的 7 个参数,自定义线程池
spring boot创建线程池
springboot创建线程池,Spring提供的对ThreadPoolExecutor封装的线程池ThreadPoolTaskExecutor,直接使用注解启用。
Async相当于是方法级别的线程,本身没有自定义线程池更加灵活
package com.example.demo.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.task.TaskExecutor;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;import java.util.concurrent.ThreadPoolExecutor;/*** @Description: TODO* @author: sl* @date: 2024年05月30日 22:37*/
@Configuration
public class MyPoolConfig {@Beanpublic TaskExecutor taskExecutor(){ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();//设置核心线程数executor.setCorePoolSize(10);//设置最大线程数executor.setMaxPoolSize(15);//设置队列容量executor.setQueueCapacity(20);//设置线程活跃时间(秒)executor.setKeepAliveSeconds(60);//设置默认线程名称executor.setThreadNamePrefix("1111-");//设置拒绝策略executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());//等待所有任务结束后再关闭线程池executor.setWaitForTasksToCompleteOnShutdown(true);return executor;}}
在Async中指定线程池
package com.example.demo;import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;/*** @Description: TODO* @author: sl* @date: 2024年05月30日 21:55*/
@Component
public class DemoController {/*** Async相当于是方法级别的线程,本身没有自定义线程池更加灵活* 相当于是每进来一个请求就开启一个线程,超过核心线程数小于最大线程数放入队列,* 队列满了,继续创建线程直至达到最大线程数* @throws InterruptedException*/@Async("taskExecutor")public void testSync() throws InterruptedException {System.out.println(Thread.currentThread().getName());Thread.sleep(2000);System.out.println("异步执行成功");}
}
执行结果:

相关文章:
spring boot 中的异步@Async
spring boot 开启异步调用 1、启动类上添加EnableAsync注解,表示启动异步 2、在具体实现异步的方法上添加Async注解 package com.example.demo;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootAppli…...
【C++/STL】list(常见接口、模拟实现、反向迭代器)
🌈个人主页:秦jh_-CSDN博客🔥 系列专栏:https://blog.csdn.net/qinjh_/category_12575764.html?spm1001.2014.3001.5482 目录 前言 list的常见接口 对迭代器的封装 节点 重载-> const迭代器 list与vector的对比 反向迭代…...
wms中对屏幕进行修改wm size设置屏幕宽高原理剖析
背景: 上面是正常屏幕1440x2960的屏幕大小,如果对display进行相关的修改,可以使用如下命令: adb shell wm size 1080x1920 得出如下的画面 明显看到差异就是屏幕上下有黑边了,那么下面就来调研这个wm size是怎么做的…...
java面试题及答案2024,java2024最新面试题及答案(之一)
发现网上很多Java面试题都没有答案,所以花了很长时间搜集整理出来了这套Java面试题大全,希望对大家有帮助哈~ 本套Java面试题大全,全的不能再全,哈哈~ 一、Java 基础 1. JDK 和 JRE 有什么区别? JDK:Ja…...
Go Modules 使用
文章参考https://blog.csdn.net/wohu1104/article/details/110505489 不使用Go Modules,所有的依赖包都是存放在 GOPATH /pkg下,没有版本控制。如果 package 没有做到完全的向前兼容,会导致多个项目无法运行(包版本需求不同)。 于是推出了g…...
结账和反结账
结账与反结账功能在财务软件和会计系统中扮演着重要的角色,以下是关于这两个功能的详细解释: 一、结账功能 结账功能是计算和结转各个会计科目本期发生额和期末余额的过程,同时标志着一定时期内财务活动的结束和财务数据的固化。结账功能的…...
k8s怎么监听资源的变更
监听k8s所有的 Deployment 资源 package mainimport ("context""fmt"v1 "k8s.io/api/apps/v1""k8s.io/apimachinery/pkg/util/json""k8s.io/client-go/informers""k8s.io/client-go/kubernetes""k8s.io/cli…...
Cobaltstrike常用功能
一、快捷工具栏 3、需要创建监听器,才能让靶机上线,连接我们公网服务端上去开启的帧监听端口,做任何操作 都是通过服务器的IP地址去连接靶机,去和靶机进行文件stage的一个传输和交互。这里推荐把cs 放到公网上边,比较…...
UWP与WPF:微软两大UI框架
在微软的开发者生态系统中,UWP(Universal Windows Platform)与WPF(Windows Presentation Foundation)是构建Windows应用的两大明星框架。它们各自携带独特的设计理念和技术特性,服务于不同的开发需求和应用场景。本文将深入探讨这两者之间的异同…...
【面试】字节码文件是跨平台的吗?
目录 1. 说明 1. 说明 1.字节码文件(.class文件)是跨平台的。2.字节码文件是Java源代码经过Java编译器(javac)编译后生成的中间代码文件,这些包含了Java虚拟机(JVM)指令,而不是特定…...
SpringCloud中注册中心Nacos的下载与使用步骤
1.前言 Nacos(Dynamic Naming and Configuration Service)是阿里巴巴开源的一款服务发现和配置管理工具。它可以帮助用户自动化地进行服务注册、发现和配置管理,是面向微服务架构的一个重要组成部分。 2.下载 链接:https://pan.b…...
心缘Hub小程序
心缘Hub小程序 文章目录 心缘Hub小程序[TOC](文章目录) 前言飞书文章:[添加链接描述](https://mqdyd6qj756.feishu.cn/wiki/X9qbwrq70i43W0kr5X8cqytSnKb) 一、简介 前言 飞书文章:添加链接描述 一、简介 心缘Hub 不要钱可以匹配 有缘人 、直接拿微信…...
攻防世界maze做法(迷宫题)
首先查壳64bit,直接丢进ida64中进行反编译就完事儿了,然后直接进入main函数打注释分析首先,题目已经提示了这是个迷宫题,我们抓住做迷宫题的两个要点,一找玩法,二找地图, 玩法在主函数中&#…...
PID——调参的步骤
第一步:确定比例增益P 确定比例增益 P 时,首先去掉 PID 的积分项和微分项,一般是令 Ti0、 Td0(具体见PID 的参数设定说明),使PID 为纯比例调节。 输入设定为系统允许的最大值60%~70%,由0逐渐加…...
Deno入门:Node.js的现代替代品
Deno 作为 Node.js 的现代替代品,提供了许多改进和创新,尤其是在安全性、模块系统和开发体验方面。虽然它仍处于发展阶段,但对于寻求简洁、安全和现代化 JavaScript/TypeScript 开发环境的开发者来说,Deno 是一个值得考虑的选择。…...
WIFI 万[néng]钥匙 v5.0.10/v4.9.80 SVIP版!
WiFi Master Key v5.0.10/v4.9.80 WIFI万[Nng]钥匙APP是一款专业的网络连接工具,设计宗旨在于为用户提供方便快捷的WiFi接入方案。本应用集成了覆盖全国的大量免费WiFi热点信息,确保用户能够在不同地区快速而稳定地连接到互联网。此外,该应用…...
JCR一区级 | Matlab实现TCN-BiLSTM-MATT时间卷积双向长短期记忆神经网络多特征分类预测
JCR一区级 | Matlab实现TCN-BiLSTM-MATT时间卷积双向长短期记忆神经网络多特征分类预测 目录 JCR一区级 | Matlab实现TCN-BiLSTM-MATT时间卷积双向长短期记忆神经网络多特征分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 1.JMatlab实现TCN-BiLSTM-MATT时间卷积双…...
redis之发布与订阅
华子目录 什么是发布与订阅?常用命令psubscribe pattern1 [pattern2...]subscribe channel1 [channel2...]publish channel messagepunsubscribe pattern1 [pattern2...]unsubscribe [channel1 [channel2...]]pubsub subcommand argument1 [argument2...] 示例1示例…...
LLM主流开源代表模型
LLM主流开源大模型介绍 1 LLM主流大模型类别 随着ChatGPT迅速火爆,引发了大模型的时代变革,国内外各大公司也快速跟进生成式AI市场,近百款大模型发布及应用。 目前,市面上已经开源了各种类型的大语言模型,本章节我们…...
Openharmony的usb从框架到hdf驱动流程梳理
HDF框架实现了用户层与内核层进行通信的管理框架,关于其简易通信示例在以下两篇博文中有所介绍, 一个例子了解通过Openharmony的HDF框架实现简易驱动的流程https://blog.csdn.net/procedurecode/article/details/128906246 Openharmony的用户态应用通过HDF框架驱动消息机制…...
【LeetCode 刷题日】19.删除链表的倒数第n个节点
🔥个人主页:北极的代码(欢迎来访) 🎬作者简介:java后端学习者评论和 ❄️个人专栏:苍穹外卖日记,SSM框架深入,JavaWeb ✨命运的结局尽可永在,不屈的挑战却不可…...
连登IEEE/Elsevier一区TOP刊!PINN+强化学习新突破!
**研究方法:**论文提出基于PINNs与强化学习融合的自适应优化控制方法,通过PINNs整合物理定律与在线数据建模系统动力学,借助自动微分特性辅助自适应动态规划迭代逼近连续时间哈密顿-雅可比-贝尔曼方程解,结合Actor-Critic框架优化…...
**TEE加持下的安全编程实践:基于Rust的可信执行环境开发实战**在现代软件系统日益复杂的今天
TEE加持下的安全编程实践:基于Rust的可信执行环境开发实战 在现代软件系统日益复杂的今天,数据隐私与运行时安全已成为开发者不可回避的核心挑战。传统的沙箱机制和用户权限控制早已无法满足对敏感计算场景(如金融交易、生物识别、AI推理&…...
AI率从90%降到合格线,我踩了3个坑后找到的方法
我的论文AI率在知网检出了91%。 最后我把AI率降到了9%,但在这之前踩了3个坑,多花了将近两天时间。这篇文章不是炫成绩,是把这3个坑说清楚,让后来的人少走一段弯路。 坑一:花了一天手动改写,基本没用 拿到…...
论文AI率80%+的紧急处理方案,答辩前用得上
距离答辩3天,AI率检出80%——这是最糟糕的时间点碰到最糟糕的问题。 不要慌,这个情况有成熟的处理方案,我见过很多人在这个时间节点成功降下来的。下面是紧急情况下的处理方法,按照时间紧迫程度分了几个场景。 先做一个判断&…...
2025届必备的十大降重复率助手实测分析
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 针对维普系统有的AI检测机制,要是想降低生成文本的机器特征,那就得从…...
UFS4.0协议之电源与信号完整性设计探析
1. UFS4.0协议的核心电源架构解析 第一次拆解UFS4.0存储芯片时,我被其电源系统的精密设计震撼到了。与早期版本相比,UFS4.0将供电网络细分为VCC(2.5V)、VCCQ(1.2V)和VCCQ2(1.8V)三级…...
Linux内核中的锁机制对比:选择合适的同步原语
Linux内核中的锁机制对比:选择合适的同步原语 作为一名深耕操作系统和嵌入式开发的工程师,我对Linux内核中的各种锁机制有着深入的理解。不同的锁适用于不同的场景,选择合适的锁对于系统性能至关重要。 内核锁的类型 1. 互斥锁(Mu…...
从销售预测到异常检测:时间序列分解在业务中的5个高能应用场景
时间序列分解:驱动业务决策的5个实战场景解析 当电商平台的库存经理面对双十一前暴涨的销售曲线时,当数据中心运维工程师盯着突然飙升的服务器指标时,他们需要的不是数学公式的推导,而是能直接指导行动的时序洞察。时间序列分解技…...
游戏开发中的乒乓缓存实战:Unity双缓冲技术如何提升渲染性能
游戏开发中的乒乓缓存实战:Unity双缓冲技术如何提升渲染性能 在Unity游戏开发中,渲染性能优化一直是开发者关注的焦点。当画面复杂度和特效层级不断提升时,传统的单缓冲机制往往难以满足流畅渲染的需求,这时乒乓缓存(P…...
