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 ...
随机推荐
- hadoop的核心思想【转】
[转自]:http://www.superwu.cn/2014/01/10/963/ 1.1.1. hadoop的核心思想 Hadoop包括两大核心,分布式存储系统和分布式计算系统. 1.1.1.1. ...
- 第23章 RTX 低功耗之待机模式
以下内容转载自安富莱电子: http://forum.armfly.com/forum.php STM32F103 待机模式介绍 本章节我们主要讲解待机模式,待机模式可实现系统的最低功耗.该模式是在 ...
- django配置数据库
配置数据库 Django默认使用SQLite数据库 在settings.py文件中通过DATABASES选项进行数据库配置 配置MySQL Python3.x中安装的是PyMySQL 在__init_ ...
- How To Set Up SSH Keys
How To Set Up SSH Keys.https://www.digitalocean.com/community/tutorials/how-to-set-up-ssh-keys--2
- Java多线程中的Runnable和Thread
摘要: 在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类是在java.lang包中定义的.一个类只要继承了Thread类同时覆写了本类中的r ...
- 树型结构递归 实体递归 JSON格式
用递归实现无限级菜单,产品分类,盖楼式评论.留言等功能. 下列代码不能直接使用 CREATE TABLE [dbo].[P_Category]( [Code] [varchar](36) NOT NU ...
- 网络构建入门技术(3)——IP地址分类
说明(2017-5-16 09:48:08): 1. IP地址
- WebApi增删改查Demo
1.新建webapi项目 2.配置WebApiConfig public const string DEFAULT_ROUTE_NAME = "MyDefaultRoute"; p ...
- Maven 统一指定jar包版本的方法
在看别人的源码的过程中,会遇到这种情况,就是很多jar包没有指定版本,却能够下载下来. 在后来的研究中发现,有这样一个配置. <parent> <groupId>org.spr ...
- visualstudio学习
https://docs.microsoft.com/zh-CN/visualstudio/ide/get-started-with-visual-studio