Spring Boot2.0之@Async实现异步调用

实战Spring Boot 2.0系列(三) - 使用@Async进行异步调用详解 前言 异步调用 对应的是 同步调用,同步调用 指程序按照 定义顺序 依次执行,每一行程序都必须等待上一行程序执行完成之后才能执行;异步调用 指程序在顺序执行时,不等待 异步调用的语句 返回结果 就执行后面的程序。 正文 1. 环境准备 利用 Spring Initializer 创建一个 gradle 项目 spring-boot-async-task,创建时添加相关依赖... 阅读详情

Spring Boot2.0之@Async实现异步调用

 补充一个知识点:

lombok底层原理使用的是: 字节码技术ASM修改字节码文件,生成比如类似于get() set( )方法

一定要在开发工具安装 在编译时候修改字节码文件(底层使用字节码技术),线上环境使用编译好的文件

 

下面我们学习 Spring Boot 异步调用技术:

启动加上@EnableAsync ,需要执行异步方法上加入    @Async

在方法上加上@Async之后 底层使用多线程技术

在底层实际上是帮助创建线程了 

首先创建类:MembrController

  package com.toov5.jsp;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RestController;

import com.toov5.service.MemberService;

import lombok.extern.slf4j.Slf4j;

@RestController
@Slf4j
public class MemberController {
  @Autowired
  private MemberService memberService;
  
    public String addMemberAndEmail(){
       log.info("1");
       String result = memberService.addMemberAndEmail();
       log.info("4");
       return result;
    }
    
}

MemberService

package com.toov5.service;

import org.springframework.stereotype.Service;

import lombok.extern.slf4j.Slf4j;

@Service
@Slf4j
public class MemberService {
    //添加用户时候发送邮件
    public String addMemberAndEmail(){
        log.info("2");  
        try {
            Thread.sleep(5000);
        } catch (Exception e) {
            // TODO: handle exception
        }
        log.info("3");
        return "toov5";

    }
    
    
}

我们做个分析:

这个项目是没有开线程的情况下的,代码从上往下同步进行的,log输出结果就是1 2 3 return返回结果  4 然后返回结果 

看结果:

 

先输出1 2  然后 五秒 后 3  4  效果是同步的

下面隆重接受一个注解

@Async 相当于这个方法重新开辟了新的线程去执行

 

然后启动类一定要加上启动的注解!!!@EnableAsync

 

 加上 @EnableAsync看看指定的包里面  有哪些加了@Asyn注解 加了的在运行时候通过AOP技术,创建线程去执行

执行结果:

controller的代码这样:

  package com.toov5.jsp;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.toov5.service.MemberService;

import lombok.extern.slf4j.Slf4j;

@RestController
@Slf4j
public class MemberController {
  @Autowired
  private MemberService memberService;
    
    @RequestMapping("/addMemberAndEmail")
    public String addMemberAndEmail(){
       log.info("1");
       String result = memberService.addMemberAndEmail();
       log.info("4");
       return "result"+result;
    }
    
}

结果:

 

 结果值是没有拿到 主线程就后已经结束了哈 所以为 null

 

原理思路:

使用AOP技术,在运行时候 创建单独线程进行执行 

可以这么代替:

package com.toov5.service;


import org.springframework.stereotype.Service;

import lombok.extern.slf4j.Slf4j;

@Service
@Slf4j
public class MemberService {
    //添加用户时候发送邮件
//	@Async
//	public String addMemberAndEmail(){
//		log.info("2");  
//		try {
//			Thread.sleep(5000);
//		} catch (Exception e) {
//			// TODO: handle exception
//		}
//		log.info("3");
//		return "toov5";
//
//	}

	public String addMemberAndEmail(){
		
	   new Thread(new Runnable() {
		
		public void run() {
		
			log.info("2");  
			try {
				Thread.sleep(5000);
			} catch (Exception e) {
				// TODO: handle exception
			}
			log.info("3");
//			return "toov5";  //这里应该用从callable  有返回值 或者future模式
				
		}
	}).start();
	
	   return "toov5";  //将就下 返回值由于是用的runnable写的嘛 先这样迁就下
		
	}
	
	

		
}

 效果:

 

 

小伙伴是不是很好玩呀?赶紧尝试一下吧~

 

@Async注解提升Spring Boot项目中API接口并发能力 相反,程序会继续执行其他任务,当异步操作完成时,会调用一个预先定义好的回调函数来处理结果。总结:主程序在异步调用之后,主程序并不会理会这三个函数是否执行完成了,由于没有其他需要执行的内容,所以程序就自动结束了,导致了不完整或是没有输出任务相关内容的情况。例如,第一次调用中,任务一和任务三的执行时间都是 784 毫秒,而任务二的执行时间是 6176 毫秒,因此任务一和任务三先完成,任务二最后完成。支持链式调用,可以在一个异步操作完成后立即执行另一个异步操作,形成一个异步操作链。 阅读详情

相关推荐

SpringBoot使用MultipartFile类上传文件,@Async异步处理报文件不存在异常(提供Gitee源码)

SpringBoot使用MultipartFile类上传文件,@Async异步处理报文件不存在:java.io.FileNotFoundException。springboot上传文件以后会形成MultiPartFile的实例,在临时文件夹中生成临时文件,之后实例解析该临时文件夹,当主线程结束以后,也就是controller层,springboot会删除该临时的文件,这时候service层再去解析该临时文件,发现文件已经被springboot删除了,故报文件不存在的异常。

黄团团的个人博客 3289

springboot @Async 异步调用接口处理数据

新增的数据需要分发给下游业务系统,由于下游业务系统状态未知,所以需要异步发送数据给下游业务系统。系统生效按钮--->controller新增-->异步调用servcie--->数据集成。即可实现方法的异步调用,再次在contorller使用的异步方法添加。注解开启项目的异步调用功能,其次需异步调用的方法上加上注解。第三步:servcie方法添加异步注解@Async。第四步使用:在contorller中使用异步方法。

lp_cq242的博客 1520

STM32F103C8T6实战指南:从零搭建最小系统与GPIO控制

本文详细介绍了STM32F103C8T6微控制器的实战应用,从零开始讲解如何搭建最小系统并进行GPIO控制。内容涵盖电源电路设计、时钟配置、GPIO工作模式详解及实战项目开发,帮助初学者快速掌握这款ARM Cortex-M3内核微控制器的核心开发技能,适用于物联网设备和嵌入式系统开发。

lemon的博客 632

springboot2.0 @Async异步调用

1. App上加@EnableAsync注解 @SpringCloudApplication @EnableAsync public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }...

卓小洛的专栏 1096

开坑!双向逆变电源实操系列--第一节PFC

文章摘要 本文介绍了PFC(功率因数校正)的基本概念及其重要性。PFC电路通过储能和功率因数校正两大功能,解决交流电小电压大电流的问题,并减少无功电流损耗。文章对比分析了无源PFC(电感串联式、填谷式、LC谐振式)和有源PFC(升压型、交错并联、图腾柱式)的拓扑结构及适用场景。针对2400W双相逆变电源设计,作者选择图腾柱PFC拓扑,详细阐述了设计思路,包括电气参数计算、性能指标设定、技术重点及风险预判。文章还提供了主电路参数定制计算方法,如BOOST电感值的推导过程,为电源工程师提供实用参考。

lyzh971103的博客 2548

【3D目标检测】激光雷达和相机联合标定(一)——ROS同步解包

激光雷达和相机联合标定(一)——ROS同步解包

qq_44703886的博客 4235

springboot2.x基础教程:@Async开启异步任务

在开发项目中通常我们有场景需要开启异步任务。比如在用户注册成功时,需要发放一些优惠券。此时为了不让这些额外的操作影响用户的注册流程,我们通常开启一个线程异步去执行发放优惠券逻辑。 通常我们需要自己定义一个线程池,开启一个线程任务。在Springboot中对其进行了简化处理,自动配置一个 org.springframework.core.task.TaskExecutor类型任务线程池,当我们开启@EnableAsync注解时,在需要执行异步任务的方法添加@Async注解时,该方法自动会开启一个线程去执行。.

编程之家出品 463

ST-LINK调试STM32H743必看:CubeMX工程中缺失的这行代码导致程序跑飞

本文深入剖析了使用ST-LINK调试STM32H743时,因CubeMX工程中缺失电源电压档位配置代码而导致程序跑飞或出现“Can not access memory”错误的问题。文章解释了H7系列电源与时钟耦合的核心原理,提供了具体的代码修复方案和系统化的调试排查思路,帮助开发者从根本上解决这一常见调试困境。

weixin_29191669的博客 281

实战Spring Boot 2.0系列(三) - 使用@Async进行异步调用

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

gmls_xrh的博客 210

YOLOv11 模型轻量化全流程:从剪枝到量化,打造移动端“极速检测利器”

将浮点模型量化为INT8模型,减少内存占用并加速推理。# 加载剪枝后的模型# 转换为TorchScript# 静态量化# 保存量化模型量化后模型推理速度可再提升20%,而mAP损失小于1%。

m0_64661770的博客 465

华为OD机试新系统真题【仓库盘点】

华为OD机试真题 新系统【仓库盘点】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【仓库盘点】

qq_45776114的博客 572

SpringBoot中使用@Async实现异步调用

SpringBoot中使用@Async实现异步调用

YIYIYI 1530

十三种通信接口芯片——《器件手册--通信接口芯片》

通信接口芯片用于实现差分信号的传输,具有抗干扰能力强、传输距离远等优点。RS485支持多点通信,可连接多个收发器,而RS422支持单向多点通信。广泛应用于工业自动化、过程控制、仪器仪表、楼宇自动化(如暖通空调、保安系统)、电机控制等领域。ST3485EBDRTP8485ESR用于实现串行通信,支持点对点通信,传输距离相对较短,数据速率较低。常用于计算机与外设(如打印机、调制解调器)之间的通信。如芯力特的SIT3232,可作为ST3232的替代品。

XU157303764的博客 4273

【SpringBoot】SpringBoot 中使用 @Async 实现优雅地异步调用

在 Java 中,当我们需要执行异步操作时,往往会去创建一个新线程去执行,如下: ```java public class App { public static void main( String[] args ) { new Thread(() -> { System.out.println(Thread.currentThread().getName() + ":异步任务"); }).start(); } } ``` Spring

sco5282的博客 1万+

CLASSB类移植(满足IEC 60730-1和60355-1标准)

针对软件认证需要满足IEC 60730-1和60335-1标准,ST公司专门提供的软件扩展包X-CUBE-CLASSB,它包含自测库和文档,支持多种STM32系列芯片,通过预集成测试库和标准化流程,帮助开发者快速满足国际安全标准,适用于家电、工业控制等高可靠性场景。ClassB软件包程序检测内容分为两个主要部分:启动时的自检和运行时的周期自检,MCU在上电的时候会进行复位启动,在启动完成以后会进行运行自检。

m0_61973119的博客 1402

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Spring Boot 之 @Async实现异步调用

什么是“异步调用”? “异步调用”对应的是“同步调用”, 同步调用 指程序按照定义顺序依次执行,每一行程序都必须等待上一行程序执行完成之后才能执行; 异步调用 指程序在顺序执行时,不等待异步调用的语句返回结果就执行后面的程序。 同步调用 下面通过一个简单示例来直观的理解什么是同步调用: 定义Task类,创建三个处理函数分别模拟三个执行任务的操作,操作消耗时间随机取(10秒内) @Component public class Task { public static Random random =

当冬夜渐暖的博客 823

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Spring Boot(十)使用@Async实现异步调用

项目GitHub地址 : https://github.com/FrameReserve/TrainingBoot Spring Boot(十)使用@Async实现异步调用 ,标记地址: https://github.com/FrameReserve/TrainingBoot/releases/tag/0.0.10 Spring Boot启动类,增加@EnableA

a286352250的博客 2万+

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Spring Boot使用@Async实现异步调用

1. Spring Boot使用@Async实现异步调用 链接:#link 原文:http://blog.csdn.net/a286352250/article/details/53157822 项目GitHub地址 : https://github.com/FrameReserve/TrainingBoot Spring Boot(十)使用@Async实现异步调用 ,标记地址: https://...

我的博客 800

SpringBoot 中使用 @Async 实现异步调用​

SpringBoot 中使用 @Async 实现异步调用可以帮助提升系统性能,适用于耗时任务、日志记录、消息通知和缓存更新等场景。通过 @EnableAsync 启用异步支持,在方法上添加 @Async 注解即可实现异步处理。使用时需注意配置合适的线程池并妥善处理异步任务中的异常。调试异步方法时可采用日志输出或特殊调试工具。合理运用 @Async 能显著提高系统吞吐量和响应速度。

深耕 Java 后端与企业级软件架构设计,专注微服务、分布式系统、大模型 AI 应用架构落地。 1280

spring boot 使用注解@async实现异步调用

什么是“异步调用”?        “异步调用”对应的是“同步调用”,同步调用指程序按照定义顺序依次执行,每一行程序都必须等待上一行程序执行完成之后才能执行;异步调用指程序在顺序执行时,不等待异步调用的语句返回结果就执行后面的程序。 同步调用 下面通过一个简单示例来直观的理解什么是同步调用:        定义Task类,创建三个处理函数分别模拟三个执行任务的操作,操作消耗时间随机

ForeverLove的博客 4193

Spring Boot 异步调用@Async

JAVA中可以自己创建线程等多种方式来实现异步调用,在spring3.0中,引入了@Async注解,让开发者能够更方便的实现异步效果。下面来看看再SpringBoot中如何正确的使用异步调用。 一、启动类中,使用@EnableAsync注解开始异步功能 @SpringBootApplication @EnableAsync public class YCloudsServiceDemoApp...

IT小跟班 508

Spring Boot使用@Async实现异步调用:ThreadPoolTaskScheduler线程池的优雅关闭

上周发了一篇关于Spring Boot中使用@Async来实现异步任务和线程池控制的文章:《Spring Boot使用@Async实现异步调用:自定义线程池》。由于最近身边也发现了不少异步任务没有正确处理而导致的不少问题,所以在本文就接前面内容,继续说说线程池的优雅关闭,主要针对ThreadPoolTaskScheduler线程池。 问题...

weixin_34413065的博客 1637

Spring注解 @Async 实现异步调用方法

异步方法调用使用场景:处理日志、发送邮件、发送短信。。。 关于@Async: (1)Spring 3.0 以及以后版本中支持的@Async (2)@Async修饰类,则该类所有方法都是异步的,@Async修饰方法,则该方法是异步的。 (3)只有@Async注解修饰的方法还不能够生效,还需要在SpringBoot的主程序Application中或对应的类上配置注解@EnableAsync才能...

csdnluolei 834
上一篇: Spring Boot2.0之统一处理web请求日志
下一篇: Spring Boot2.0之自定义参数
Art&Code
博客等级 码龄7年 77粉丝 554原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值