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注解使用的更多相关文章

  1. 【快学springboot】10.使用@Async注解创建多线程,自定义线程池

    说明 使用@Async注解创建多线程非常的方便,还可以通过配置,实现线程池.比直接使用线程池简单太多.而且在使用上跟普通方法没什么区别,加上个@Async注解即可实现异步调用. 用法 AsyncTas ...

  2. SpringBoot中神奇的@Enable*注解?

    在SpringBoot开发过程,我们经常会遇到@Enable开始的好多注解,比如@EnableEurekaServer.@EnableAsync.@EnableScheduling等,今天我们就来分析 ...

  3. Springboot中使用自定义参数注解获取 token 中用户数据

    使用自定义参数注解获取 token 中User数据 使用背景 在springboot项目开发中需要从token中获取用户信息时通常的方式要经历几个步骤 拦截器中截获token TokenUtil工具类 ...

  4. 在Spring-boot中,为@Value注解添加从数据库读取properties支持

    一般我们会把常用的属性放在工程的classpath文件夹中,以property,yaml或json的格式进行文件存储,便于Spring-boot在初始化时获取. @Value则是Spring一个非常有 ...

  5. SpringBoot中关于@Enable***的注解详解

    出处:http://blog.csdn.net/qq_26525215 @EnableAspectJAutoProxy @EnableAspectJAutoProxy注解 激活Aspect自动代理 & ...

  6. springboot:异步调用@Async

    在后端开发中经常遇到一些耗时或者第三方系统调用的情况,我们知道Java程序一般的执行流程是顺序执行(不考虑多线程并发的情况),但是顺序执行的效率肯定是无法达到我们的预期的,这时就期望可以并行执行,常规 ...

  7. SpringBoot 中定时执行注解(@Scheduled、@EnableScheduling)

    项目开发中经常需要执行一些定时任务,比如需要在每天凌晨时候,分析一次前一天的日志信息.Spring为我们提供了异步执行任务调度的方式,提供TaskExecutor .TaskScheduler 接口. ...

  8. springboot之异步调用@Async

    原文:http://www.cnblogs.com/xuwenjin/p/8858050.html 引言: 在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的:但是在处理与第三方系统交 ...

  9. @Async注解的坑,小心

    大家好,我是三友. 背景 前段时间,一个同事小姐姐跟我说她的项目起不来了,让我帮忙看一下,本着助人为乐的精神,这个忙肯定要去帮. 于是,我在她的控制台发现了如下的异常信息: Exception in ...

随机推荐

  1. hadoop的核心思想【转】

    [转自]:http://www.superwu.cn/2014/01/10/963/ 1.1.1. hadoop的核心思想 Hadoop包括两大核心,分布式存储系统和分布式计算系统. 1.1.1.1. ...

  2. 第23章 RTX 低功耗之待机模式

    以下内容转载自安富莱电子: http://forum.armfly.com/forum.php STM32F103 待机模式介绍 本章节我们主要讲解待机模式,待机模式可实现系统的最低功耗.该模式是在 ...

  3. django配置数据库

    配置数据库 Django默认使用SQLite数据库 在settings.py文件中通过DATABASES选项进行数据库配置 配置MySQL Python3.x中安装的是PyMySQL 在__init_ ...

  4. 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

  5. Java多线程中的Runnable和Thread

    摘要: 在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类是在java.lang包中定义的.一个类只要继承了Thread类同时覆写了本类中的r ...

  6. 树型结构递归 实体递归 JSON格式

    用递归实现无限级菜单,产品分类,盖楼式评论.留言等功能. 下列代码不能直接使用 CREATE TABLE [dbo].[P_Category]( [Code] [varchar](36) NOT NU ...

  7. 网络构建入门技术(3)——IP地址分类

    说明(2017-5-16 09:48:08): 1. IP地址

  8. WebApi增删改查Demo

    1.新建webapi项目 2.配置WebApiConfig public const string DEFAULT_ROUTE_NAME = "MyDefaultRoute"; p ...

  9. Maven 统一指定jar包版本的方法

    在看别人的源码的过程中,会遇到这种情况,就是很多jar包没有指定版本,却能够下载下来. 在后来的研究中发现,有这样一个配置. <parent> <groupId>org.spr ...

  10. visualstudio学习

    https://docs.microsoft.com/zh-CN/visualstudio/ide/get-started-with-visual-studio