所谓异步任务,其实就是异步执行程序,有些时候遇到一些耗时的的任务,如果一直卡等待,肯定会影响其他程序的执行,所以就让这些程序需要以异步的方式去执行。那么下面就来介绍Spring Boot 如何实现异步任务。

一、使用注解@EnableAsync 开启异步调用方法
在application启动类中,加上@EnableAsync注解,Spring Boot 会自动扫描异步任务。

package com.weiz;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
import tk.mybatis.spring.annotation.MapperScan;@SpringBootApplication
//扫描 mybatis mapper 包路径
@MapperScan(basePackages = "com.weiz.mapper")
//扫描 所有需要的包, 包含一些自用的工具类包 所在的路径
@ComponentScan(basePackages = {"com.weiz","org.n3r.idworker"})
//开启定时任务
@EnableScheduling
//开启异步调用方法
@EnableAsync
public class SpringBootStarterApplication {public static void main(String[] args) {SpringApplication.run(SpringBootStarterApplication.class, args);}}

二、创建异步执行类,定义@Component及@Async组件
创建com.weiz.tasks包,在tasks包里增加AsyncTask 异步任务类,加上@Component 注解,然后在需要异步执行的方法前面加上@Async注解,这样Spring Boot容器扫描到相关异步方法之后,调用时就会将这些方法异步执行。

package com.weiz.tasks;import java.util.concurrent.Future;import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.AsyncResult;
import org.springframework.stereotype.Component;@Component
public class AsyncTask {@Asyncpublic Future<Boolean> doTask11() throws Exception {long start = System.currentTimeMillis();Thread.sleep(1000);long end = System.currentTimeMillis();System.out.println("任务1耗时:" + (end - start) + "毫秒");return new AsyncResult<>(true);}@Asyncpublic Future<Boolean> doTask22() throws Exception {long start = System.currentTimeMillis();Thread.sleep(700);long end = System.currentTimeMillis();System.out.println("任务2耗时:" + (end - start) + "毫秒");return new AsyncResult<>(true);}@Asyncpublic Future<Boolean> doTask33() throws Exception {long start = System.currentTimeMillis();Thread.sleep(600);long end = System.currentTimeMillis();System.out.println("任务3耗时:" + (end - start) + "毫秒");return new AsyncResult<>(true); }
}

说明:@Async 加上这个注解,就表示该方法是异步执行方法。

三、调用
创建一个DoTask调用类,我们看看这几个方法,是怎么执行的:

package com.weiz.tasks;import java.util.concurrent.Future;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("tasks")
public class DoTask {@Autowiredprivate AsyncTask asyncTask;@RequestMapping("test1")public String test1() throws Exception {long start = System.currentTimeMillis();Future<Boolean> a = asyncTask.doTask11();Future<Boolean> b = asyncTask.doTask22();Future<Boolean> c = asyncTask.doTask33();while (!a.isDone() || !b.isDone() || !c.isDone()) {if (a.isDone() && b.isDone() && c.isDone()) {break;}}long end = System.currentTimeMillis();String times = "任务全部完成,总耗时:" + (end - start) + "毫秒";System.out.println(times);return times;}
}

四、测试
启动程序之后,在浏览器输入:
http://localhost:8080/tasks/test1 。

Spring Boot如何实现异步执行任务
从这个总耗时可以看出,三个方法确实是异步执行的。耗时接近时间最长的doTask11方法。

最后
以上,就把Spring Boot 创建异步任务的方法简单介绍完了,是不是特别简单。

原文链接:https://www.toutiao.com/i6808469696052986371/?tt_from=copy_link&utm_campaign=client_share&timestamp=1621642440&app=news_article&utm_source=copy_link&utm_medium=toutiao_ios&use_new_style=1&req_id=202105220813590101351640814021C8BE&share_token=5746C8DF-AB97-4ABF-B662-1B85EBDA258C&group_id=6808469696052986371&wid=1621642833054

Spring Boot如何实现异步执行任务相关推荐

  1. Spring Boot 中的异步调用

    Spring Boot 中的异步调用 通常我们开发的程序都是同步调用的,即程序按照代码的顺序一行一行的逐步往下执行,每一行代码都必须等待上一行代码执行完毕才能开始执行.而异步编程则没有这个限制,代码的 ...

  2. Spring Boot技术之异步任务执行

    在spring中有一个AsyncConfigurer接口,实现该接口可以配置异步线程池,源码部分如下: public interface AsyncConfigurer {/*** 获取线程池* Th ...

  3. Spring Boot项目开启异步使用多线程完整代码案例

    本文通过代码来演示如果在spring boot的项目中使用多线程,也就是异步.要异步并不难,我们写的代码天天都在跟异步多线程打交道,容易让人感到迷惑的是异步的底层原理,不仅要会使用,更要熟悉其实现原理 ...

  4. Spring Boot Maven 打包可执行Jar文件!

    Maven pom.xml 必须包含 [plain] view plaincopy <packaging>jar</packaging> [html] view plainco ...

  5. springboot 使用spring的线程池异步执行

    springboot异步执行 1.启动类在这里插入代码片 @SpringBootApplication public class ThreadStudyApplication {public stat ...

  6. 【264期】面试官问:Spring Boot 启动时自动执行代码方式有哪几种?解释一二!...

    点击上方"Java精选",选择"设为星标" 别问别人为什么,多问自己凭什么! 下方有惊喜,留言必回,有问必答! 每一天进步一点点,是成功的开始... 前言 目前 ...

  7. Spring Boot实战:异步编程指南

    通过本文你可以了解到下面这些知识点: Future 模式介绍以及核心思想 核心线程数.最大线程数的区别,队列容量代表什么: ThreadPoolTaskExecutor 饱和策略: SpringBoo ...

  8. Spring Boot相关知识(二) Spring Boot项目启动的执行顺序和原理

    2019独角兽企业重金招聘Python工程师标准>>> 1. 环境,程序入口 @SpringBootApplication public class Application {pub ...

  9. Spring Boot 中启用异步调用

    在Java中一般开发程序都会同步调用的,程序中代码是一行一行执行下去的,每一行代码需要等待上一行代码执行完成才能开始执行. 在异步编程中,代码执行不是阻塞的,在方法调用中不需要等待所有代码执行完毕就可 ...

最新文章

  1. 互联网之父公开拍卖万维网源代码,3400万买下后发现居然有bug
  2. linux软件安装简介(apt和dpkg)
  3. java学习笔记14--多线程编程基础1
  4. Linux 文件系统详解
  5. LeetCode 2097. 合法重新排列数对(欧拉路径)
  6. docker前后端分离_Docker分离模式介绍
  7. HTML如何实现斜体字
  8. 蓝桥杯 ADV-223 算法提高 8-1因式分解
  9. Atitit Server Side Include  ssi服务端包含规范 csi  esi
  10. Win10 重装系统备忘
  11. 在vs里配置其他编译器
  12. 逆向研究QCA9563固件,查看和修改GPIO定义
  13. 网银汇款提示服务器无响应,为什么我的网上银行支付页面总是未响应
  14. IPFS - 可快速索引的版本化的点对点文件系统
  15. 洛谷 P2672 推销员 解题报告
  16. vite+ts+vue3 知识点(全局组件,局部组件,递归组件)
  17. 【Unity3D自学记录】 Unity3D游戏开发之键盘选取、切换目标
  18. 华为和H3c--交换技术
  19. 加速度计及其飞控应用
  20. zip压缩解压缩开源库-LiteZip

热门文章

  1. nest学习:定时任务
  2. linux登录Hana数据库,【Zabbix】HANA数据库密码重置
  3. 关于overleaf的一些坑
  4. android日历之滚动选择日期类似ios
  5. vue用Symbol方式全局封装Iconfont阿里巴巴矢量库图标组件
  6. C语言实现单色位图的放大
  7. 数据库连接失败原因和解决方案
  8. 计算机考研11408考试内及考试大纲
  9. Mixed Content: The page at“https://xxx”was loaded over HTTPS, but requested an insecure
  10. 听周华健专辑《少年》有感(一)-献给曾经的自己