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毫秒后,才返回返回值。

SpringBoot用@Async注解实现异步任务

SpringBoot用@Async注解实现异步任务

来源:https://blog.csdn.net/qq_39506912/article/details/89788014

标签:SpringBoot,@Async,异步
0
投稿

猜你喜欢

  • Android TextView字体颜色设置方法小结

    2023-02-22 14:44:52
  • C#调用JS的几种方法

    2022-09-29 23:24:18
  • springboot max-http-header-size最大长度的那些事及JVM调优方式

    2021-12-14 03:43:46
  • java实现动态代理示例分享

    2023-04-28 15:54:49
  • 谈谈HttpClient使用详解

    2022-11-03 08:19:02
  • MyBatis入门学习教程-MyBatis快速入门

    2023-10-25 05:06:07
  • Java实例讲解Comparator的使用

    2021-07-15 09:16:58
  • 如何利用Java AWT 创建一个简易计算器

    2023-04-22 03:04:08
  • android多媒体音乐(MediaPlayer)播放器制作代码

    2022-01-06 01:13:20
  • 关于apollo和Spring集成@Value注解通用解析

    2022-03-30 23:06:03
  • Java中锁的实现和内存语义浅析

    2021-06-04 01:09:49
  • Android实现美女拼图游戏详解

    2023-10-16 21:11:15
  • c#委托详解和和示例分享

    2022-10-26 12:29:41
  • java实现小球碰撞功能

    2023-04-05 19:22:41
  • 将文件夹下所有文件输出到日志文件中 c#递归算法学习示例

    2023-04-08 20:36:22
  • JAVA JNI函数的注册过程详细介绍

    2023-02-07 18:41:17
  • BeanUtils.copyProperties在拷贝属性时忽略空值的操作

    2022-07-11 05:22:04
  • C#通过属性名字符串获取、设置对象属性值操作示例

    2022-01-06 14:28:08
  • android studio3.4安装指南图文教程

    2021-08-26 12:27:08
  • 使用AccessibilityService实现自动遍历点赞功能

    2023-10-18 16:22:53
  • asp之家 软件编程 m.aspxhome.com