SpringBoot中使用@Async实现异步任务调用详解
一、什么是asynchronous call(异步调用)
一个可以无需等待被调用函数的返回值就让操作继续进行的方法(来自百度百科)。
即程序在顺序执行时,不等待异步调用的语句返回结果就执行后面的程序。
二、Spring Boot 使用 @Async 注解实现异步化
我们只需要通过使用 @Async 注解就能简单的将同步函数变为异步函数,例如新建一个 Asynctask 异步任务类,源码如下。
package com.example.asynctask.asynvtask; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; /** * @description * @date 2019/4/19 11:20 */ @Component public class Asynctask { // 任务一 @Async public void doTaskOne() throws Exception { System.out.println("开始做任务一"); long start = System.currentTimeMillis(); Thread.sleep(3000); long end = System.currentTimeMillis(); System.out.println("完成任务一,耗时:" + (end - start) + "毫秒"); } // 任务二 @Async public void doTaskTwo() throws Exception { System.out.println("开始做任务二"); long start = System.currentTimeMillis(); Thread.sleep(5000); long end = System.currentTimeMillis(); System.out.println("完成任务二,耗时:" + (end - start) + "毫秒"); } // 任务3 @Async public void doTaskThree() throws Exception { System.out.println("开始做任务三"); long start = System.currentTimeMillis(); Thread.sleep(8000); long end = System.currentTimeMillis(); System.out.println("完成任务三,耗时:" + (end - start) + "毫秒"); } }
为了让 @Async 注解能够生效,还需要在 SpringBoot 的主程序中配置 @EnableAsync,如下所示。
package com.example.asynctask; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.scheduling.annotation.EnableAsync; @SpringBootApplication @EnableAsync public class AsynctaskApplication { public static void main(String[] args) { SpringApplication.run(AsynctaskApplication.class, args); } }
编写测试类,源码如下。
package com.example.asynctask.controller; import com.example.asynctask.asynvtask.Asynctask; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; /** * @description @Async 注解实现异步任务 * @date 2019/4/19 11:20 */ @RestController @RequestMapping("/test") public class AsynctaskController { @Resource private Asynctask asynctask; @RequestMapping("/task") public String task2() throws Exception { asynctask.doTaskOne(); asynctask.doTaskTwo(); asynctask.doTaskThree(); return "===== test ok ====="; } }
测试结果:反复执行时,可能出现多种不同的测试结果(任务1、2、3执行顺序不同),以下是一种情况。
开始做任务三
开始做任务一
开始做任务二
完成任务一,耗时:2992毫秒
完成任务二,耗时:4987毫秒
完成任务三,耗时:7980毫秒
三、注意事项
1、在 @SpringBootApplication 启动类添加注解@EnableAsync;
2、异步方法使用注解 @Async ,返回值为 void 或者 Future;
3、切记一点 ,异步方法和调用方法要分别写在不同的类中,如果写在一个类中,是没有效果的。
到此这篇关于SpringBoot中使用@Async实现异步任务调用详解的文章就介绍到这了,更多相关@Async异步任务调用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
详解Spring注入集合(数组、List、Map、Set)类型属性
这篇文章主要介绍了详解Spring注入集合(数组、List、Map、Set)类型属性,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2021-01-01
最新评论