SpringBoot中使用@Async实现异步任务调用详解

 更新时间:2023年12月12日 11:05:34   作者:长安明月  
这篇文章主要介绍了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 data jpa 模糊查询like的坑点

    关于spring data jpa 模糊查询like的坑点

    这篇文章主要介绍了关于spring data jpa 模糊查询like的坑点,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Spring中HandlerMethod类源码详细解析

    Spring中HandlerMethod类源码详细解析

    这篇文章主要介绍了Spring中HandlerMethod类源码详细解析,HandlerMethod类用于封装控制器方法信息,包含类信息、方法Method对象、参数、注解等信息,具体的接口请求是可以根据封装的信息调用具体的方法来执行业务逻辑,需要的朋友可以参考下
    2023-11-11
  • Java List一些常用方法完全攻略

    Java List一些常用方法完全攻略

    List就是一个线性表,即n个具有相同类型元素的有限序列,在该序列上可以执行增删改查以及变量等操作,这篇文章主要介绍了Java List一些常用方法的相关资料,需要的朋友可以参考下
    2026-04-04
  • 手把手教你idea中创建一个javaweb(webapp)项目详细图文教程

    手把手教你idea中创建一个javaweb(webapp)项目详细图文教程

    这篇文章主要介绍了如何使用IntelliJ IDEA创建一个Maven项目,并配置Tomcat服务器进行运行,过程包括创建项目、配置运行环境、部署项目以及测试运行,需要的朋友可以参考下
    2025-01-01
  • 浅析Alibaba Nacos注册中心源码剖析

    浅析Alibaba Nacos注册中心源码剖析

    这篇文章主要介绍了浅析Alibaba Nacos注册中心源码剖析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-05-05
  • Java中&与&&的区别及说明

    Java中&与&&的区别及说明

    这篇文章主要介绍了Java中&与&&的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • SpringBoot2.x集成Dozer的示例代码

    SpringBoot2.x集成Dozer的示例代码

    本文主要介绍了SpringBoot2.x集成Dozer的示例代码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • es创建索引和mapping的实例

    es创建索引和mapping的实例

    这篇文章主要介绍了es创建索引和mapping的实例,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • Mybatis查询返回Map<String,Object>类型实例详解

    Mybatis查询返回Map<String,Object>类型实例详解

    这篇文章主要给大家介绍了关于Mybatis查询返回Map<String,Object>类型的相关资料,平时没太注意怎么用,今天又遇到了总结记录一下,方便以后处理此类问题,需要的朋友可以参考下
    2022-07-07
  • 深入理解Thread.sleep(0)的作用

    深入理解Thread.sleep(0)的作用

    本文主要介绍了深入理解Thread.sleep(0)的作用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-09-09

最新评论