`

56. spring boot中使用@Async实现异步调用【从零开始学Spring Boot】

阅读更多

  

什么是异步调用

       “异步调用”对应的是“同步调用”,同步调用指程序按照定义顺序依次执行,每一行程序都必须等待上一行程序执行完成之后才能执行;异步调用指程序在顺序执行时,不等待异步调用的语句返回结果就执行后面的程序。

 

同步调用

下面通过一个简单示例来直观的理解什么是同步调用:

       定义Task类,创建三个处理函数分别模拟三个执行任务的操作,操作消耗时间随机取(10秒内)

package com.kfit.task;

 

import java.util.Random;

import org.springframework.stereotype.Component;

 

/**

 * 定义3个任务

 * @author Angel(QQ:412887952)

 * @version v.0.1

 */

@Component

publicclass Task1 {

    //定义一个随机对象.

    publicstatic Random random =new Random();

 

    //任务一;

    publicvoid doTaskOne() throws Exception {

        System.out.println("开始做任务一");

        longstart = System.currentTimeMillis();

        Thread.sleep(random.nextInt(10000));

        longend = System.currentTimeMillis();

        System.out.println("完成任务一,耗时:" + (end - start) + "毫秒");

    }

 

    //任务二;

    publicvoid doTaskTwo() throws Exception {

        System.out.println("开始做任务二");

        longstart = System.currentTimeMillis();

        Thread.sleep(random.nextInt(10000));

        longend = System.currentTimeMillis();

        System.out.println("完成任务二,耗时:" + (end - start) + "毫秒");

    }

 

    //任务3;

    publicvoid doTaskThree() throws Exception {

        System.out.println("开始做任务三");

        longstart = System.currentTimeMillis();

        Thread.sleep(random.nextInt(10000));

        longend = System.currentTimeMillis();

        System.out.println("完成任务三,耗时:" + (end - start) + "毫秒");

    }

 

}

 

编写一个访问方法:

//测试task1.

    @RequestMapping("/task1")

    public String task1() throws Exception{

       task1.doTaskOne();

       task1.doTaskTwo();

       task1.doTaskThree();

       return"task1";

    }

运行可以看到类似如下输出:

   开始做任务一

    完成任务一,耗时:4156毫秒

    开始做任务二

    完成任务二,耗时:557毫秒

    开始做任务三

    完成任务三,耗时:6171毫秒

 

异步调用

上述的同步调用虽然顺利的执行完了三个任务,但是可以看到执行时间比较长,若这三个任务本身之间不存在依赖关系,可以并发执行的话,同步调用在执行效率方面就比较差,可以考虑通过异步调用的方式来并发执行。

Spring Boot中,我们只需要通过使用@Async注解就能简单的将原来的同步函数变为异步函数,Task类改在为如下模式:

package com.kfit.task;

 

import java.util.Random;

 

import org.springframework.scheduling.annotation.Async;

import org.springframework.stereotype.Component;

 

/**

 * 定义3个任务

 * @author Angel(QQ:412887952)

 * @version v.0.1

 */

@Component

publicclass Task2 {

    //定义一个随机对象.

    publicstatic Random random =new Random();

 

    //任务一;

    @Async

    publicvoid doTaskOne() throws Exception {

        System.out.println("开始做任务一");

        longstart = System.currentTimeMillis();

        Thread.sleep(random.nextInt(10000));

        longend = System.currentTimeMillis();

        System.out.println("完成任务一,耗时:" + (end - start) + "毫秒");

    }

 

    //任务二;

    @Async

    publicvoid doTaskTwo() throws Exception {

        System.out.println("开始做任务二");

        longstart = System.currentTimeMillis();

        Thread.sleep(random.nextInt(10000));

        longend = System.currentTimeMillis();

        System.out.println("完成任务二,耗时:" + (end - start) + "毫秒");

    }

 

    //任务3;

    @Async

    publicvoid doTaskThree() throws Exception {

        System.out.println("开始做任务三");

        longstart = System.currentTimeMillis();

        Thread.sleep(random.nextInt(10000));

        longend = System.currentTimeMillis();

        System.out.println("完成任务三,耗时:" + (end - start) + "毫秒");

    }

 

}

       为了让@Async注解能够生效,还需要在Spring Boot的主程序中配置@EnableAsync,如下所示:

@SpringBootApplication

@EnableAsync

publicclass App {

    //省略其它代码

}

编写测试方法:

//测试task2.

    @RequestMapping("/task2")

    public String task2() throws Exception{

       task2.doTaskOne();

       task2.doTaskTwo();

       task2.doTaskThree();

       return"task2";

    }

 

此时可以反复执行单元测试,您可能会遇到各种不同的结果,比如:

开始做任务一

开始做任务二

开始做任务三

完成任务三,耗时:57毫秒

完成任务二,耗时:3621毫秒

 

完成任务一,耗时:7419毫秒

 

 

Spring Boot 系列博客】

à悟空学院:https://t.cn/Rg3fKJD

学院中有Spring Boot相关的课程!点击「阅读原文」进行查看!

SpringBoot视频:http://t.cn/A6ZagYTi

Spring Cloud视频:http://t.cn/A6ZagxSR

SpringBoot Shiro视频:http://t.cn/A6Zag7IV

SpringBoot交流平台:https://t.cn/R3QDhU0

SpringData和JPA视频:http://t.cn/A6Zad1OH

SpringSecurity5.0视频:http://t.cn/A6ZadMBe

Sharding-JDBC分库分表实战http://t.cn/A6ZarrqS

分布式事务解决方案「手写代码」:http://t.cn/A6ZaBnIr

 

网易云课堂视频最新更新

第十一章 Spring Boot 日志

1、spring boot日志—理论

2、Spring Boot日志-logback

3、Spring Boot日志-log4j2

第十二章 Spring Boot 知识点2

1、spring boot 服务配置和部署

2、Spring Boot 定制URL匹配规则

 

 

历史章节

 

第一章 快速开始

1、Spring Boot之Hello World

2、Spring Boot之Hello World访问404

 

第二章 Spring Boot之JSON

1、spring boot返回json数据

2、Spring Boot完美使用FastJson解析JSON数据

 

第三章 Spring Boot热部署

1、Spring Boot热部署(springloader)

2、springboot + devtools(热部署)

 

第四章 Spring Boot数据库

1、Spring Boot JPA/Hibernate/Spring Data概念

2、Spring Boot JPA-Hibernate

3、Spring Boot Spring Data JPA介绍

4、Spring Boot JdbcTemplate

5、Spring Boot集成MyBatis

 

第五章 web开发

1、全局异常捕捉

2、配置server信息

3、spring boot使用thymeleaf

4、Spring Boot 使用freemarker

5、Spring Boot添加JSP支持

 

第六章 定时任务

1、Spring Boot定时任务

2、Spring Boot 定时任务升级篇(动态修改cron参数)

3、Spring Boot 定时任务升级篇(动态添加修改删除定时任务)

4、Spring Boot 定时任务升级篇(集群/分布式下的定时任务说明)

5、Spring Boot Quartz介绍

6、Spring Boot Quartz在Java Project中使用

7、Spring Boot 集成Quartz普通使用

8、Spring Boot 集成Quartz升级版

9、Spring Boot 集成Quartz二次升级版

10、Spring Boot 集成Quartz-Job如何自动注入Spring容器托管的对象

 

第七章 Spring Boot MyBatis升级篇

1、Spring Boot MyBatis升级篇-注解

2、Spring Boot MyBatis升级篇-注解-自增ID

3、Spring Boot MyBatis升级篇-注解-增删改查

4、Spring Boot MyBatis升级篇-注解-分页查询

5、Spring Boot MyBatis升级篇-注解-分页PageHelper不生效

6、Spring Boot MyBatis升级篇-注解- mybatic insert异常:BindingException: Parameter 'name' not found

7、Spring Boot MyBatis升级篇-注解- #和$符号特别篇

8、Spring Boot MyBatis升级篇-注解-@Result

9、Spring Boot MyBatis升级篇-注解-动态SQL(if test)-方案一:<script>

10、Spring Boot MyBatis升级篇-注解-动态SQL(if test)-方案二:@Provider

11、Spring Boot MyBatis升级篇-注解-动态SQL-参数问题

12、Spring Boot MyBatis升级篇-注解-特别篇:@MapperScan和@Mapper

13、Spring Boot MyBatis升级篇-XML

14、Spring Boot MyBatis升级篇-XML-自增ID

15、Spring Boot MyBatis升级篇-XML-增删改查

16、Spring Boot MyBatis升级篇-XML-分页查询

17、Spring Boot MyBatis升级篇-XML-分页PageHelper不生效

18、Spring Boot MyBatis升级篇-XML-动态SQL(if test)

19、Spring Boot MyBatis升级篇-XML-注解-初尝试

20、Spring Boot MyBatis升级篇- pagehelper替换为pagehelper-spring-boot-starter

 

第八章 Spring Boot 知识点1

1、Spring Boot 拦截器HandlerInterceptor

2、Spring Boot启动加载数据CommandLineRunner

3、Spring Boot环境变量读取和属性对象的绑定

4、Spring Boot使用自定义的properties

5、Spring Boot使用自定义的properties

6、Spring Boot使用@SpringBootApplication

7、Spring Boot 监控和管理生产环境

 

第十章 Spring Boot 打包部署

1、Spring Boot打包部署((提供Linux的sh文件))

 

第十一章 Spring Boot 日志

1、spring boot日志—理论

2、Spring Boot日志-logback

 

3、Spring Boot日志-log4j2

 

更多查看博客: http://412887952-qq-com.iteye.com/

 

分享到:
评论
10 楼 林祥纤 2017-08-29  
恋无涯 写道
楼主应该分个类别,我这智商跟不上你排版  
开玩笑!
真的  分个类别比你在每篇里填上链接清晰多了


恩。
9 楼 恋无涯 2017-08-29  
楼主应该分个类别,我这智商跟不上你排版  
开玩笑!
真的  分个类别比你在每篇里填上链接清晰多了
8 楼 林祥纤 2016-11-27  
k88520 写道
博主 我是你的脑残粉


O(∩_∩)O~~
7 楼 k88520 2016-11-23  
博主 我是你的脑残粉
6 楼 林祥纤 2016-10-05  
qq1488888 写道
博主你好,其实一直很想知道异步要返回结果要前端的话怎么做???


前端异步应该是servlet的异步处理,你可以了解下。
5 楼 qq1488888 2016-10-05  
博主你好,其实一直很想知道异步要返回结果要前端的话怎么做???
4 楼 林祥纤 2016-07-06  
sunbin 写道
每篇都看了,简单明了,没有问题。 十分感谢。
希望后期可以结合spring cloud的知识就更好了。


这个只能看时间安排了...
3 楼 sunbin 2016-07-06  
每篇都看了,简单明了,没有问题。 十分感谢。
希望后期可以结合spring cloud的知识就更好了。
2 楼 林祥纤 2016-07-05  
sunbin 写道
用了很多次,现在才搞明白。


您是在哪里卡主了,有什么地方我可以帮您的吗,或者您觉得文章可以在哪些方面可以在提升下。
1 楼 sunbin 2016-07-05  
用了很多次,现在才搞明白。

相关推荐

    Spring Boot利用@Async如何实现异步调用:自定义线程池

    在Spring Boot中,可以使用@Async注解来实现异步调用。 使用@Async实现异步调用 在Spring Boot中,使用@Async注解可以将方法异步执行。@Async注解可以应用于方法上,使得该方法可以异步执行。例如: ```java @...

    spring boot中使用@Async实现异步调用任务

    在Spring Boot中,异步调用是通过Spring的`@Async`注解来实现的,它允许我们在不阻塞主线程的情况下执行耗时的操作。这极大地提高了应用的响应速度,尤其是在处理大量并发请求时。接下来,我们将深入探讨如何在...

    spring boot 使用@Async实现异步调用方法

    下面将详细解释如何在Spring Boot中使用`@Async`实现异步调用,以及其背后的原理。 首先,要启用`@Async`注解的功能,需要在Spring Boot的主配置类上添加`@EnableAsync`注解。这会告诉Spring框架,你需要异步任务的...

    springboot中@Async异步调用注解的使用

    在Spring Boot框架中,@Async注解是实现异步任务处理的关键工具,它允许开发者将耗时的操作从主线程中分离出来,以提高应用程序的响应速度。本文将深入探讨@Async的工作原理、配置方法以及使用场景,帮助你更好地...

    Spring Boot异步调用@Async过程详解

    Spring Boot 异步调用 @Async 过程详解是 Spring Boot 框架中的一种异步调用机制,通过使用 @Async 注解可以将方法异步执行,提高系统的并发性和响应速度。本文将详细介绍 Spring Boot 异步调用 @Async 过程详解的...

    JAVA 中Spring的@Async用法总结

    JAVA 中Spring的@Async用法总结 在 Java 应用中,绝大多数情况下都是通过同步的方式来实现交互处理的...以上就是 Spring 中 @Async 的用法总结,通过使用 @Async 可以轻松地实现异步调用,提高系统的响应速度和性能。

    Spring @async方法如何添加注解实现异步调用

    Spring @Async 方法如何添加注解实现异步调用 Spring 框架提供了 @Async 注解来实现异步调用,该注解可以在方法上添加,以使得方法被异步调用。下面我们将详细介绍 Spring @Async 方法如何添加注解实现异步调用。 ...

    Spring Boot 线程池的创建、@Async 配置步骤及注意事项.docx

    通过以上步骤,你可以在Spring Boot应用中创建线程池并配置`@Async`,实现异步任务的执行。请根据实际需求调整线程池的参数,以达到最佳的并发性能和资源利用。同时,注意异步处理可能带来的问题,如结果同步、异常...

    Spring中@Async注解执行异步任务的方法

    Spring中@Async注解执行异步任务的方法 在业务处理中,有些业务使用异步的方式更为合理。这篇文章主要介绍了Spring中@Async注解执行异步任务的方法。@Async注解是Spring提供的一个annotation,可以将方法异步化,...

    Spring Boot利用@Async异步调用:使用Future及定义超时详解

    在Spring Boot应用中,我们可以利用`@Async`注解实现异步调用,这有助于提高应用程序的并发性能,尤其在处理耗时操作时。本文将详细介绍如何使用`@Async`结合`Future`来处理异步任务,并探讨如何定义超时。 `@Async...

    深入理解Spring注解@Async解决异步调用问题

    深入理解Spring注解@Async解决异步调用问题 本文将详细介绍Spring框架中的@Async注解,并深入理解其在解决异步调用问题中的应用。通过示例代码和详细的解释,帮助读者更好地理解@Async的使用和原理。 一、异步调用...

    29. Spring boot 文件上传(多文件上传)【从零开始学Spring Boot】

    在本教程中,我们将深入探讨如何使用Spring Boot实现文件上传功能,特别是多文件上传。Spring Boot简化了在Java应用程序中处理文件上传的过程,使得开发者能够更专注于业务逻辑,而不是底层的HTTP操作。以下是对该...

    Spring中@Async注解实现异步调详解

    Spring中@Async注解实现异步调用详解 在Spring框架中,@Async注解是实现异步调用的一个重要机制。异步调用是指在程序执行过程中,不需要等待某个方法的执行结果,而是继续执行下一个方法。这种机制可以极大地提高...

    SpringBoot实现定时任务和异步调用

    首先,在 Spring Boot 主类上使用 @EnableAsync 注解来启动异步调用: ```java package com.example.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure....

    Springboot启用async异步调用

    在Spring Boot中,启用...总结起来,Spring Boot中的异步调用通过`@Async`注解实现,可以显著提高应用的响应速度,特别是在处理耗时任务时。同时,合理的线程池配置和异常处理策略是确保异步功能高效、稳定运行的关键。

    @scheduled任务调度使用详解及@scheduled与多线程和@Async异步任务结合使用

    总结,`@Scheduled`任务调度是Spring Boot中实现定时任务的关键,它可以配合多线程和`@Async`异步任务提升程序的并发性能。通过自定义线程池和配置`TaskExecutor`,我们可以更好地控制任务的执行方式,从而优化应用...

    浅谈Spring @Async异步线程池用法总结

    可以使用@EnableAsync注解来开启异步调用功能,並且可以自定义自己的线程池。 @EnableAsync注解需要配合public AsyncTaskExecutor taskExecutor()方法来使用,这样可以自定义自己的线程池。否则,将使用系统默认的...

    Spring Async:实现异步调用示例.docx

    【Spring Async:实现异步调用示例】 在软件开发中,特别是在高并发场景下,异步调用是一个重要的优化手段。同步调用是传统的执行方式,它遵循线性顺序,每个方法调用必须等待前一个方法执行完毕才能继续。而异步...

    Spring boot注解@Async线程池实例详解

    * 最简单的异步调用,返回值为 void,基于 @Async 无返回值调用,直接在使用类,使用方法上,加上注解。 * 带参数的异步调用,异步方法可以传入参数。 * 异常调用返回 Future,不会被 AsyncUncaughtExceptionHandler...

    【java框架】SpringBoot(10) -- SpringBoot巧用 @Async提升API接口并发能力 .pdf

    在高并发的Web应用中,提高接口的并发处理能力是至关重要的,而SpringBoot框架提供了一种简单有效的方法——使用`@Async`注解来实现异步调用,从而优化性能。本文将深入探讨什么是异步调用,以及如何在SpringBoot中...

Global site tag (gtag.js) - Google Analytics