SpringBoot用@Async注解实现异步任务
作者:Kellen5l 发布时间:2023-08-07 06:36:09
什么是异步调用?
异步调用是相对于同步调用而言的,同步调用是指程序按预定顺序一步步执行,每一步必须等到上一步执行完后才能执行,异步调用则无需等待上一步程序执行完即可执行。
如何实现异步调用?
多线程,这是很多人第一眼想到的关键词,没错,多线程就是一种实现异步调用的方式。
在非spring目项目中我们要实现异步调用的就是使用多线程方式,可以自己实现Runable接口或者集成Thread类,或者使用jdk1.5以上提供了的Executors线程池。
StrngBoot中则提供了很方便的方式执行异步调用。
异步接口的使用场景
耗时比较长,任务比较多的接口。比方说,文件下载,大文件下载比较耗时,这个时候就可以使用异步接口。
项目示例已上传至GitHub,可见github项目地址。
在解释异步调用之前,我们先来看同步调用的定义;同步就是整个处理过程顺序执行,当各个过程都执行完毕,并返回结果。 异步调用则是只是发送了调用的指令,调用者无需等待被调用的方法完全执行完毕;而是继续执行下面的流程。
例如, 在某个调用中,需要顺序调用 A, B, C三个过程方法;如他们都是同步调用,则需要将他们都顺序执行完毕之后,方算作过程执行完毕; 如B为一个异步的调用方法,则在执行完A之后,调用B,并不等待B完成,而是执行开始调用C,待C执行完毕之后,就意味着这个过程执行完毕了。
@Async介绍
基于@Async标注的方法称为异步方法,方法在执行的时候,将会在独立的线程中被执行,调用者无需等待它的完成,即可继续其他的操作。使用时在SpringBoot主配置类中开启异步即可。
@EnableAsync
@SpringBootApplication
public class SpringBootAsyncTestApplication {
无返回值异步方法
@Async
public void asyncMethodWithNoReturnType() {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("asyncMethodWithNoReturnType...");
}
使用方法比较简单,编写一个测试方法并加上@Async注解即可。
含返回值异步方法
@Async
public Future<String> asyncMethodWithReturnType() {
try {
Thread.sleep(3000);
return new AsyncResult<String>("success");
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("asyncMethodWithReturnType...");
return null;
}
返回值利用Future泛型接口实现。
Future是对于具体的 Runnable 或者 Callable 任务的执行结果进行取消、查询是否完成、获取结果的接口,必要时可以通过get方法获取执行结果,该方法会阻塞直到任务返回结果,包含了以下几个方法。
public interface Future<V> {
boolean cancel(boolean mayInterruptIfRunning);
boolean isCancelled();
boolean isDone();
V get() throws InterruptedException, ExecutionException;
V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException;
}
1.cancel方法的作用是取消任务,取消任务成功则返回true,反之返回false。参数 mayInterruptIfRunning 表示是否允许取消正在执行却没有执行完毕的任务。
运行cancel方法取消任务时:
i.若任务已完成:则无论 mayInterruptIfRunning 为 true 或 false,此方法都返回 false,即取消已经完成的任务都会返回false。
i.若任务正在执行:
mayInterruptIfRunning 设置为 true,则返回true。
mayInterruptIfRunning 设置为false,则返回false。
iii.如果任务未执行,则无论mayInterruptIfRunning为true还是false,都返回true。
2.isCancelled方法的作用是判断任务是否被取消成功,若在任务正常完成前被取消,则返回 true。
3.isDone方法的作用是判断任务是否已经完成,若任务已完成,则返回true。
4.get()方法的作用是获取执行结果,注意此方法会产生阻塞,等到任务执行完毕后才能获得执行结果。
5.get(long timeout, TimeUnit unit)方法的作用同样是获取执行结果,若在指定时间内还未获取到执行结果,则返回null。
编写测试接口
编写/callWithNoReturnType和/callWithReturnType接口用于查看异步任务的执行过程。
@RestController
public class AsyncController {
@Autowired
AsyncService asynSerivce;
@GetMapping("/callWithNoReturnType")
public String callWithNoReturnType() {
asynSerivce.asyncMethodWithNoReturnType();
return "success";
}
@GetMapping("/callWithReturnType")
public String callWithReturnType() {
Future<String> future=asynSerivce.asyncMethodWithReturnType();
try {
return future.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
return "fail";
}
运行项目后使用Postman进行接口测试,分别给/callWithNoReturnType和/callWithReturnType接口发送Get请求,调用无返回值的异步方法asyncWithNoReturnType时,会立即返回返回值。但调用含返回值异步方法asyncWithReturnType时,由于我们调用了get()方法,会在等待3000毫秒后,才返回返回值。
来源:https://blog.csdn.net/qq_39506912/article/details/89788014


猜你喜欢
- 数据结构是数据存储的方式,算法是数据计算的方式。所以在开发中,算法和数据结构息息相关。今天的讲义中会涉及部分数据结构的专业名词,如果各位铁粉
- 概述LinearLayout是线性布局组件,放置在其中的组件按列或者按行(就是垂直或者水平)的方式排序分布。常用XML配置属性(1)&nbs
- 一、目的本篇文章的目的是记录本人使用flutter加载与调用第三方aar包。二、背景本人go后端,业余时间喜欢玩玩flutter。一直有一个
- main.xml:<?xml version="1.0" encoding="utf-8"?&
- 这篇文章主要介绍了JavaWeb如何实现禁用浏览器缓存,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋
- 什么是TKMybatisTKMybatis 是基于Mybatis 框架开发的一个工具,内部实现了对单表的基本数据操作,只需要简单继承 TKM
- 详解Android使用@hide的API的方法今天早上想修改MediaPlaybackService.Java(/packages/apps
- 1.首先解释一下什么是方法重载?方法重载是指在同一个类中方法同名,参数不同,调用时根据实参的形式,选择与他匹配的方法执行操作的一种技术。这里
- 本文为大家分享了Android Studio使用USB真机调试的具体方法,供大家参考,具体内容如下以小米4为例,先将手机通过USB连接电脑,
- 本文介绍了Android 删除所有build编译文件,翻译磁盘空间,分享给大家,也给自己留个笔记,具体如下: public static v
- 介绍1.BLE 是 Bluetooth Low Energy 的缩写,意思为低功耗蓝牙。由蓝牙技术联盟(Bluetooth SI
- 下面笔者说说自己对进制转换的分析:笔者认为,任何进制都可以直接转换到十进制,而十进制也可以相当容易的转换到其他进制,所以笔者在这里将十进制作
- 本文主要实现在自定义的ListView布局中加入CheckBox控件,通过判断用户是否选中CheckBox来对ListView的选中项进行相
- Java与Oracle实现事务(JDBC事务)实例详解J2EE支持JDBC事务、JTA事务和容器事务事务,这里说一下怎样实现JDBC事务。&
- 其实很简单,就是把我们的数据库文件放到我们的手机里,所以不必局限在哪个地方写这个代码,在第一次创建数据库的时候可以,我觉得在软件起动页里效果
- 假设我们有一个类:Productpublic class Product{ public string
- 废话不多说,先看下实现后的效果:实现思路看到上边 gif 图的效果,主要列举一下实现过程过程中遇到的难点。如何使键盘弹出时候不遮挡底部登录布
- 在窗体中添加DataGridView控件和ConTextMenuStrip1控件,修改DataGridView属性,将contextMenu
- 在学习 Spring Mvc 过程中,有必要来先了解几个关键参数:@Controller:在类上注解,则此类将编程一个控制器,在项目启动 S
- Bean:在Spring技术中是基于组件的最基本了是最常用的单元其实实例保存在Spring的容器当中Bean通常被定义在配置文件当中,Bea