广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >SpringBoot中异步调用@Async的方法
  • 830
分享到

SpringBoot中异步调用@Async的方法

2024-04-02 19:04:59 830人浏览 薄情痞子
摘要

本篇内容主要讲解“SpringBoot中异步调用@Async的方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“springBoot中异步调用@Async的方法

本篇内容主要讲解“SpringBoot中异步调用@Async的方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习springBoot中异步调用@Async的方法”吧!

如何开启异步调用

在SpringBoot中,只需要给方法加上@Async注解,就能将同步方法变为异步调用。

首先在启动类上添加@EnableAsync,即开启异步调用。

 @SpringBootApplication @EnableAsync public class AsyncApplication {      public static void main(String[] args) {         SpringApplication.run(AsyncApplication.class, args);     }  }

在需要异步调用的方法上加上@Async注解

package com.yang.async;  import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.AsyncResult; import org.springframework.stereotype.Component;  import java.util.concurrent.Future; import java.util.concurrent.FutureTask;   @Slf4j @Component public class Task {      @Async     public void method1() {         log.info("method1开始,执行线程为" + Thread.currentThread().getName());         try {             Thread.sleep(2000);         } catch (InterruptedException e) {             e.printStackTrace();         }         log.info("method1结束");     }      @Async     public void method2() {         log.info("method2开始,执行线程为" + Thread.currentThread().getName());         try {             Thread.sleep(3000);         } catch (InterruptedException e) {             e.printStackTrace();         }         log.info("method2结束");     }   }

测试一下:

@SpringBootTest @Slf4j public class AsyncApplicationTests {      @Autowired     Task task;      @Test     public void testAsyncWithVoidReturn() throws InterruptedException {         log.info("main线程开始");          task.method1();         task.method2();          //确保两个异步调用执行完成         Thread.sleep(6000);          log.info("main线程结束");     }  }

输出如下:

SpringBoot中异步调用@Async的方法

可以看得出,SpringBoot创建了一个名为applicationTaskExecutor的线程池,使用这里面的线程来执行异步调用。

这里值得注意的是,不要在一个类中调用@Async标注的方法,否则不会起到异步调用的作用,至于为什么会产生这样的问题,需要深入到源码中一探究竟,会另开篇幅。

既然默认使用的是SpringBoot自己创建的applicationTaskExecutor,那如何自己去定义一个线程池呢?

自定义线程池

我们需要手动创建一个名为asynTaskExecutord的Bean

package com.yang.async;  import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.task.AsyncTaskExecutor; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;  import java.util.concurrent.ThreadPoolExecutor;   @Slf4j @Configuration public class AsyncConfig {      @Bean     public AsyncTaskExecutor asyncTaskExecutor() {         ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();         executor.setCorePoolSize(8);         executor.setMaxPoolSize(16);         executor.setQueueCapacity(50);         executor.setAllowCoreThreadTimeOut(true);         executor.seTKEepAliveSeconds(10);         executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());         executor.setThreadNamePrefix("async-thread-pool-thread");         return executor;     } }

对以上参数不了解的同学,可以参考我的这篇文章说说线程池

其他类不需要变动,直接运行刚才的testAsyncWithVoidReturn()方法,输出:

SpringBoot中异步调用@Async的方法

看得出来,现在是我们自定义的线程池

如果关心异步调用的返回值,又怎么处理?

获取异步调用的返回结果

获取异步调用的结果,需要利用Future机制,可以参考我的另外一篇文章谈谈Runnable、Future、Callable、FutureTask之间的关系

为Task类增加以下两个方法:

@Async   public Future<String> method3() {       log.info("method3开始,执行线程为" + Thread.currentThread().getName());       try {           Thread.sleep(1000);       } catch (InterruptedException e) {           e.printStackTrace();       }       log.info("method3结束");       return new AsyncResult<>("method3");   }    @Async   public Future<String> method4() {       log.info("method4开始,执行线程为" + Thread.currentThread().getName());       try {           Thread.sleep(3000);       } catch (InterruptedException e) {           e.printStackTrace();       }       log.info("method4结束");       return new AsyncResult<>("method4");   }

测试类:

@Test   public void testAsyncWithStringReturn() throws InterruptedException, ExecutionException {       log.info("main线程开始");        Future<String> method3Result = task.method3();       Future<String> method4Result = task.method4();        //get方法为阻塞获取       log.info("method3执行的返回结果:{}", method3Result.get());       log.info("method4执行的返回结果:{}", method4Result.get());       log.info("main线程结束");   }

输出:

SpringBoot中异步调用@Async的方法

springboot是什么

springboot一种全新的编程规范,其设计目的是用来简化新Spring应用的初始搭建以及开发过程,SpringBoot也是一个服务于框架的框架,服务范围是简化配置文件。

到此,相信大家对“SpringBoot中异步调用@Async的方法”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: SpringBoot中异步调用@Async的方法

本文链接: https://www.lsjlt.com/news/71801.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • SpringBoot中异步调用@Async的方法
    本篇内容主要讲解“SpringBoot中异步调用@Async的方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SpringBoot中异步调用@Async的方法...
    99+
    2022-10-19
  • java中@Async异步调用的方法
    本篇内容主要讲解“java中@Async异步调用的方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java中@Async异步调用的方法”吧!前言异步调用与同步调用同步调用:顺序执行,通过调用返...
    99+
    2023-07-02
  • Spring中的使用@Async异步调用方法
    目录使用@Async异步调用方法Async简介给Spring的TaskExecutor去完成本次记录Async使用场景异步请求与异步调用的区别异步请求的实现SpringBoot中异步...
    99+
    2022-11-12
  • springboot @Async 注解如何实现方法异步
    目录@Async注解如何实现方法异步一、springboot的App类需要的注解二、service层的注解三、调用层异步注解@Async的使用以及注意事项第一步开启异步下面显示配置线...
    99+
    2022-11-12
  • 详解springboot通过Async注解实现异步任务及回调的方法
    目录前言什么是异步调用?1. 环境准备2. 同步调用3. 异步调用4. 异步回调前言 什么是异步调用? 异步调用是相对于同步调用而言的,同步调用是指程序按预定顺序一步步执行,每一步必...
    99+
    2022-11-13
  • Spring中的如何使用@Async异步调用
    这篇文章主要介绍了Spring中的如何使用@Async异步调用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。使用@Async异步调用方法Async简介异步方法调用使用场景:处...
    99+
    2023-06-25
  • 一文搞懂SpringBoot如何利用@Async实现异步调用
    目录前言简单使用异步处理异步回调自定义线程池注意事项(一定注意)前言 异步调用几乎是处理高并发,解决性能问题常用的手段,如何开启异步调用?SpringBoot中提供了非常简单的方式,...
    99+
    2022-11-13
  • 深入理解spring boot异步调用方式@Async
    本文主要给大家介绍了关于spring boot异步调用方式@Async的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍:1.使用背景在日常开发的项目中,当访问其他人的接口较慢或者做耗时任务时,不想程序一直卡在耗时任务上,想程序能...
    99+
    2023-05-31
    springboot 异步调用 @async
  • Vue 中 Promise 的then方法异步使用及async/await 异步使用总结
    目录1.Promise 的 then 方法使用  2. async await 使用3. async/await处理多个异步请求1.Promise 的 then 方法使用 ...
    99+
    2023-01-12
    Promise 的 then 方法使用 async await 使用 async/await处理多个异步请求
  • SpringBoot整合Quartz及异步调用的方法是什么
    这篇文章主要介绍“SpringBoot整合Quartz及异步调用的方法是什么”,在日常操作中,相信很多人在SpringBoot整合Quartz及异步调用的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答...
    99+
    2023-07-05
  • NodeJs通过async/await处理异步的方法
    场景 远古时代 我们在编写express后台,经常要有许多异步IO的处理。在远古时代,我们都是用chunk函数处理,也就是我们最熟悉的那种默认第一个参数是error的函数。我们来模拟一个Mongo数据库的操...
    99+
    2022-06-04
    方法 NodeJs async
  • php中如何异步调用方法
    php中异步调用方法的操作步骤在返回客户端的html代码中,嵌入ajax调用或者嵌入一个img标签,src指向要执行的耗时脚本。使用popen函数打开一个指向进程的管道,该进程由派生给定的command命令执行而产生。使用CURL,设置CU...
    99+
    2022-10-08
  • Spring @Async无法实现异步的解决方案
    目录Spring @Async无法实现异步问题原因解决办法@Async不起作用1.xml头文件必须配置标记红色部分2.配置任务和线程池3.配置spring依赖的jar(不介绍这个了)...
    99+
    2022-11-12
  • SpringBoot使用Async注解失效原因分析及解决(spring异步回调)
    目录Async注解失效原因分析及解决(spring异步回调)Spring中@Async有时候在使用的过程中@Async注解会失效解决方式一解决方式二springboot @Async...
    99+
    2022-11-12
  • 在spring boot中如何使用@Async实现异步调用
    在spring boot中如何使用@Async实现异步调用?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。什么是”异步调用”与”同步调用”“同步调用”就是程序按照一定的顺序依次执...
    99+
    2023-05-31
    springboot @async 异步调用
  • Vue中的同步调用和异步调用方式
    目录Vue的同步调用和异步调用Promise实现异步调用async /await方法实现同步调用Vue同步和异步的问题基本语法实例Vue的同步调用和异步调用 Promise实现异步调...
    99+
    2022-11-13
  • Unity同步/异步调用Android的方法实例
    目录1 Unity如何使用Android插件2 同步方法如何调用2.1 例子12.2 例子23 异步方法如何调用3.1 Android端3.1.1 添加依赖3.1.2 代码逻辑3.2...
    99+
    2022-11-12
  • vue中异步函数async和await的用法说明
    目录异步函数async和await用法async/await为什么叫异步外异内同异步函数async和await用法 先说一下async的用法,它作为一个关键字放到函数前面,用于表示函...
    99+
    2022-11-13
  • Java异步调用的方法是什么
    这篇文章主要讲解了“Java异步调用的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java异步调用的方法是什么”吧!一、创建线程@Testpublic void&nbs...
    99+
    2023-06-27
  • SpringBoot异步处理的方法有哪些
    小编给大家分享一下SpringBoot异步处理的方法有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!异步请求与同步请求我们先通过一张图来区分一下异步请求和同步...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作