springboot中@EnableAsync与@Async注解使用
springboot中@EnableAsync与@Async注解使用
@Async为异步注解,放到方法上,表示调用该方法的线程与此方法异步执行,需要配合@EnableAsync注解使用。
1、首先演示没有@Async,即没有异步执行的情况
- 创建一个普通类CountNumber,并注入到IOC容器中
package com.example.demo;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component; @Component
public class CountNumber { public void PrintNumber(){
for(int i=; i<; i++){
System.out.println("i = " + i);
}
}
}
- 在spring boot的启动类中获取IOC的bean
package com.example.demo;
import java.util.concurrent.TimeUnit;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.ComponentScan; //@SpringBootApplication
@ComponentScan
public class Springboot3Application { public static void main(String[] args) throws Exception { ConfigurableApplicationContext context = SpringApplication.run(Springboot3Application.class, args); context.getBean(CountNumber.class).PrintNumber();
for(int i=; i<; i++){
System.out.println("------------------");
}
context.close();
}
}
- 运行输出结果:
i =
i =
i =
i =
i =
i =
i =
i =
i =
------------------
------------------
------------------
------------------
------------------
------------------
------------------
------------------
------------------
从输出结果中可以看出,启动类先从IOC容器中获取CountNumber的对象,然后执行该对象的PrintNumber方法,循环打印了9个数字,方法执行结束后,继续回到启动类中往下执行,因此开始执行for循环语句。从整个流程看属于顺序执行的。
2、有@Async,即异步执行的情况
- 创建一个普通类CountNumber,并注入到IOC容器中,并在该类的方法上标注@Async注解,表示该方法是异步执行的。
package com.example.demo;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component; @Component
public class CountNumber {
@Async
public void PrintNumber(){
for(int i=; i<; i++){
System.out.println("i = " + i);
}
}
}
- 从spring boot启动类中获取IOC中的bean,在启动类上标注@EnableAsync注解,启动@Async异步注解。或者在启动类中只标注@SpringBootApplication注解,因为该注解中已经包含了上面两个注解。
package com.example.demo;
import java.util.concurrent.TimeUnit;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.EnableAsync; /*@SpringBootApplication注解与@ComponentScan、@EnableAsync注解达到相同的功效*/
//@SpringBootApplication
@ComponentScan
@EnableAsync
public class Springboot3Application { public static void main(String[] args) throws Exception { ConfigurableApplicationContext context = SpringApplication.run(Springboot3Application.class, args); /*@Async和@EnableAsync配合使用*/
context.getBean(CountNumber.class).PrintNumber();
for(int i=; i<; i++){
TimeUnit.MICROSECONDS.sleep();
System.out.println("------------------");
}
context.close();
}
}
- 执行启动类,输出结果如下:
------------------
------------------
------------------
------------------
------------------
------------------
i =
i =
i =
i =
i =
i =
i =
i =
i =
------------------
------------------
------------------
从输出结果中可以看出,spring boot在获取到IOC中的CountNumber对象后,一方面继续向下执行,执行for循环语句,另一方面获取对象后,执行对象中的PrintNumber方法。因此PrintNumber方法是与主线程是异步执行的。
springboot中@EnableAsync与@Async注解使用的更多相关文章
- 【快学springboot】10.使用@Async注解创建多线程,自定义线程池
说明 使用@Async注解创建多线程非常的方便,还可以通过配置,实现线程池.比直接使用线程池简单太多.而且在使用上跟普通方法没什么区别,加上个@Async注解即可实现异步调用. 用法 AsyncTas ...
- SpringBoot中神奇的@Enable*注解?
在SpringBoot开发过程,我们经常会遇到@Enable开始的好多注解,比如@EnableEurekaServer.@EnableAsync.@EnableScheduling等,今天我们就来分析 ...
- Springboot中使用自定义参数注解获取 token 中用户数据
使用自定义参数注解获取 token 中User数据 使用背景 在springboot项目开发中需要从token中获取用户信息时通常的方式要经历几个步骤 拦截器中截获token TokenUtil工具类 ...
- 在Spring-boot中,为@Value注解添加从数据库读取properties支持
一般我们会把常用的属性放在工程的classpath文件夹中,以property,yaml或json的格式进行文件存储,便于Spring-boot在初始化时获取. @Value则是Spring一个非常有 ...
- SpringBoot中关于@Enable***的注解详解
出处:http://blog.csdn.net/qq_26525215 @EnableAspectJAutoProxy @EnableAspectJAutoProxy注解 激活Aspect自动代理 & ...
- springboot:异步调用@Async
在后端开发中经常遇到一些耗时或者第三方系统调用的情况,我们知道Java程序一般的执行流程是顺序执行(不考虑多线程并发的情况),但是顺序执行的效率肯定是无法达到我们的预期的,这时就期望可以并行执行,常规 ...
- SpringBoot 中定时执行注解(@Scheduled、@EnableScheduling)
项目开发中经常需要执行一些定时任务,比如需要在每天凌晨时候,分析一次前一天的日志信息.Spring为我们提供了异步执行任务调度的方式,提供TaskExecutor .TaskScheduler 接口. ...
- springboot之异步调用@Async
原文:http://www.cnblogs.com/xuwenjin/p/8858050.html 引言: 在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的:但是在处理与第三方系统交 ...
- @Async注解的坑,小心
大家好,我是三友. 背景 前段时间,一个同事小姐姐跟我说她的项目起不来了,让我帮忙看一下,本着助人为乐的精神,这个忙肯定要去帮. 于是,我在她的控制台发现了如下的异常信息: Exception in ...
随机推荐
- LeetCode: Jump Game II 解题报告
Jump Game II Given an array of non-negative integers, you are initially positioned at the first inde ...
- Java调用Python脚本工具类
[本文出自天外归云的博客园] 在网上查了很多方法都不成功,在google上搜到一篇文章,做了一些小修改,能够处理中文输出.提取一个运行python脚本的Java工具类如下: package com.a ...
- iOS开发:一个高仿美团的团购ipad客户端的设计和实现(功能:根据拼音进行检索并展示数据,离线缓存团购数据,浏览记录与收藏记录的批量删除等)
大致花了一个月时间,利用各种空闲时间,将这个客户端实现了,在这里主要是想记录下,设计的大体思路以及实现过程中遇到的坑...... 这个项目的github地址:https://github.com/wz ...
- C# winform打包(带数据库安装)<转>
使用VS自带的打包工具,制作winform安装项目 开发环境:VS2008 Access 操作系统:Windows XP 开发语言:C# 项目名称:**管理系统 步骤: 1.打开开发环境VS2010, ...
- eclipse中git更新操作
1,本地已经修改的代码不要commit和push 2,选中工程,右击Team,然后点击Fetch from Upstream,从远程服务器拉取最新的代码 3,上一步操作完成,再右击工程,选中Team, ...
- JS实现多行文本最后是省略号紧随其后还有个超链接在同一行的需求
1.布局及样式如下图: 2.js获得上图的div对象,然后判断div对象的高度,如果大于一行的高度了表示内容有两行了,再获得span标签里面的内容并用正则将后六个字符替换成“......”这里的实现代 ...
- Mongodb网络好文章
http://blog.csdn.net/pi9nc/article/details/17722419 mongodb集群配置. http://blog.fens.me/mongodb-replica ...
- for语句练习 阶乘
4的阶乘:4!=1*2*3*4 public class g { /** * @param args */ public static void main(String[] args) { int n ...
- Java编程的逻辑 (41) - 剖析HashSet
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...
- sublime sftp注册码
注册码: { "email": "xiaosong@xiaosong.me", "product_key": "d419f6-de ...