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写的嘛 先这样迁就下 } }
效果:
小伙伴是不是很好玩呀?赶紧尝试一下吧~
Spring Boot2.0之@Async实现异步调用的更多相关文章
- spring boot中使用@Async实现异步调用任务
本篇文章主要介绍了spring boot中使用@Async实现异步调用任务,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 什么是“异步调用”? “异步调用”对应的是“同步 ...
- 56. spring boot中使用@Async实现异步调用【从零开始学Spring Boot】
什么是"异步调用"? "异步调用"对应的是"同步调用",同步调用指程序按照定义顺序依次执行,每一行程序都必须等待上一行程序执行完成之后才能执 ...
- Spring Boot中使用@Async实现异步调用
在Spring Boot中,我们只需要通过使用@Async注解就能简单的将原来的同步函数变为异步函数,为了让@Async注解能够生效,还需要在Spring Boot的主程序中配置@EnableAsyn ...
- Spring Boot中使用@Async实现异步调用,加速任务的执行!
什么是"异步调用"?"异步调用"对应的是"同步调用",同步调用指程序按照定义顺序依次执行,每一行程序都必须等待上一行程序执行完成之后才能执行 ...
- Spring Boot使用@Async实现异步调用
原文:http://blog.csdn.net/a286352250/article/details/53157822 项目GitHub地址 : https://github.com/FrameRes ...
- 【spring cloud】spring cloud2.X spring boot2.0.4调用feign配置Hystrix Dashboard 和 集成Turbine 【解决:Hystrix仪表盘Unable to connect to Command Metric Stream】【解决:Hystrix仪表盘Loading...】
环境: <java.version>1.8</java.version><spring-boot.version>2.0.4.RELEASE</spring- ...
- spring boot 学习(十一)使用@Async实现异步调用
使用@Async实现异步调用 什么是”异步调用”与”同步调用” “同步调用”就是程序按照一定的顺序依次执行,,每一行程序代码必须等上一行代码执行完毕才能执行:”异步调用”则是只要上一行代码执行,无需等 ...
- Spring Boot2.0 整合 Kafka
Kafka 概述 Apache Kafka 是一个分布式流处理平台,用于构建实时的数据管道和流式的应用.它可以让你发布和订阅流式的记录,可以储存流式的记录,并且有较好的容错性,可以在流式记录产生时就进 ...
- 【spring colud】spring cloud微服务项目搭建【spring boot2.0】
spring cloud微服务项目搭建 =================================== 示例版本: 1.spring boot 2.0版本 2.开发工具 IntellJ IDE ...
随机推荐
- JVM内存最大能调多大分析【经典】
http://hi.baidu.com/suofang/blog/item/49c637c71c0afbd0d1006028.html 上次用weblogic 把 -XmxXXXX 设成2G, ...
- 1.1 合用weightSum属性和layout_weight属性
<打造高质量Android应用:Android开发必知的50个诀窍>第1章活用布局,本章将介绍Android布局相关的一些窍门和建议.通过本章,读者不仅可以学习如何从零开始创建特定类型的布 ...
- ARM内核和架构
转:深入浅谈,CPU设计原理 CPU的内部架构和工作原理 推荐一本书:编码的奥秘 一.ARM内核和架构 ARM产品越来越丰富,命名也越来越多.很多朋友提问: ARM内核和架构都是什么 ...
- ubuntu16.04下Cmake学习一
根据网上的资料,我总结了一下,一个工程应该有根目录(bin)存放可执行文件,头文件目录(include)存放头文件,源码文件(src)存放你的算法,还需要一个库文件夹存放你编译的静态库或者动态库.然后 ...
- 对‘TIFFReadDirectory@LIBTIFF_4.0’未定义的引用-------------- 解决办法
ABLE_DEPRECATED' is defined [-Winvalid-pch] //usr/lib/libvtkIO.so.5.10:对‘TIFFReadDirectory@LIBTIFF_4 ...
- Django之sitemap
##########settings.py SITE_ID=1 # Application definition # taggit tag INSTALLED_APPS = [ 'myblog', ' ...
- CPU调度算法
批处理系统中的调度算法: *需要考虑的因素: 1. 吞吐量 2. cpu利用率 3. 周转时间 4. 公平性* 1.先来先服务: FCFS: 优点:实现简单 缺点:可能造成周转时间长 2.最短作业优先 ...
- MongoDB--安装部署
MongoDB安装 说明: 本次安装教程: 版本:mongoDB-3.2.4 安装环境:windows 10 ,64位操作系统 准备:安装包.Robomongo(客户端用于查看mongoDB里面的数据 ...
- 目标检测之基础hessian matrix ---海森矩阵
就是海赛(海色)矩阵,在网上搜就有. 在数学中,海色矩阵是一个自变量为向量的实值函数的二阶偏导数组成的方块矩阵, Hessian矩阵是多维变量函数的二阶偏导数矩阵,H(i,j)=d^2(f)/(d(x ...
- java ResultSet获得总行数
在Java中,获得ResultSet的总行数的方法有以下几种. 第一种:利用ResultSet的getRow方法来获得ResultSet的总行数 Statement stmt = con.create ...