SpringBoot2.x异步任务EnableAsync
1.springboot启动类里面使用@EnableAsync注解开启异步功能
@EnableAsync
public class Demo001Application {
public static void main(String[] args) {
SpringApplication.run(Demo001Application.class, args);
}
}
2.异步任务类使用@Component标记组件被容器扫描,异步方法加上@Async
package com.xiaobing.demo001.task; import com.xiaobing.demo001.domain.User;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.AsyncResult;
import org.springframework.stereotype.Component;
import java.util.concurrent.Future; //@Async 类注释等同所有方法注释
@Component
public class AsynchronousTask { @Async
public void task01() throws Exception{
System.out.println("AsynchronousTask.task01");
Thread.sleep(3000);
} //增加Future 返回结果AsyncResult
@Async
public Future<Boolean> task02()throws Exception{
System.out.println("AsynchronousTask.task02");
Thread.sleep(3000);
return new AsyncResult<>(true);
}
@Async
public Future<String> task03()throws Exception{
System.out.println("AsynchronousTask.task03");
Thread.sleep(3000);
return new AsyncResult<>("task03执行");
}
@Async
public Future<User> task04()throws Exception{
System.out.println("AsynchronousTask.task04");
Thread.sleep(3000);
return new AsyncResult<>(new User(01,"Tom","123456"));
}
}
3.新建controller
package com.xiaobing.demo001.controller; import com.xiaobing.demo001.domain.Result;
import com.xiaobing.demo001.task.AsynchronousTask;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; @RestController
@RequestMapping("api/v1/test")
public class AsynchronousTaskController { @Autowired
private AsynchronousTask asynchronousTask;
@GetMapping("/asynchronous")
public Result asynchronousTask() throws Exception{
long start = System.currentTimeMillis();
asynchronousTask.task01();
asynchronousTask.task02();
asynchronousTask.task03();
asynchronousTask.task04();
long end = System.currentTimeMillis();
return new Result(1,"耗时:"+(end-start),"");
} }
4.启动项目后访问

5.将@Async注释后访问

6.注意:如果需要拿到结果 需要判断 task.isDone()
package com.xiaobing.demo001.controller; import com.xiaobing.demo001.domain.Result;
import com.xiaobing.demo001.domain.User;
import com.xiaobing.demo001.task.AsynchronousTask;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.concurrent.Future; @RestController
@RequestMapping("api/v1/test")
public class AsynchronousTaskController { @Autowired
private AsynchronousTask asynchronousTask;
@GetMapping("/asynchronous")
public Result asynchronousTask() throws Exception{
long start = System.currentTimeMillis();
asynchronousTask.task01();
asynchronousTask.task02();
asynchronousTask.task03();
Future<User> user = asynchronousTask.task04();
while (!user.isDone()){
if(user.isDone()){
User us = user.get();
System.out.println(us);
break;
}
}
long end = System.currentTimeMillis();
return new Result(1,"耗时:"+(end-start),"");
} }
运行项目:

输出:

7. 异步的使用场景:
1)不涉及共享资源,或对共享资源只读,即非互斥操作
2)没有时序上的严格关系
3)不需要原子操作,或可以通过其他方式控制原子性
4)常用于IO操作等耗时操作,因为比较影响客户体验和使用性能
5)不影响主线程逻辑
8. 同步的好处:
1)同步流程对结果处理通常更为简单,可以就近处理。
2)同步流程对结果的处理始终和前文保持在一个上下文内。
3)同步流程可以很容易捕获、处理异常。
4)同步流程是最天然的控制过程顺序执行的方式。
9. 异步的好处:
1)异步流程可以立即给调用方返回初步的结果。
2)异步流程可以延迟给调用方最终的结果数据,在此期间可以做更多额外的工作,例如结果记录等等。
3)异步流程在执行的过程中,可以释放占用的线程等资源,避免阻塞,等到结果产生再重新获取线程处理。
4)异步流程可以等多次调用的结果出来后,再统一返回一次结果集合,提高响应效率。
------------------------------------------- 学习记录!!! -----------------------------------------------
SpringBoot2.x异步任务EnableAsync的更多相关文章
- @Async 异步注释 @EnableAsync
@SpringBootApplication @ComponentScan(basePackages = "com.fddsfsg") //@EnableSwagger2 @Ena ...
- SpringBoot2.0 基础案例(04):定时任务和异步任务的使用方式
一.定时任务 1.基本概念 按照指定时间执行的程序. 2.使用场景 数据分析 数据清理 系统服务监控 二.同步和异步 1.基本概念 同步调用 程序按照代码顺序依次执行,每一行程序都必须等待上一行程序执 ...
- @EnableAsync和@Async开始异步任务支持
Spring通过任务执行器(TaskExecutor)来实现多线程和并发编程.使用ThreadPoolTaskExecutor可实现一个基于线程池的TaskExecutor.在开发中实现异步任务,我们 ...
- 【SpringBoot】整合定时任务和异步任务
========================10.SpringBoot整合定时任务和异步任务处理 =============================== 1.SpringBoot定时任务s ...
- SpringBoot整合定时任务和异步任务处理 3节课
1.SpringBoot定时任务schedule讲解 定时任务应用场景: 简介:讲解什么是定时任务和常见定时任务区别 1.常见定时任务 Java自带的java.util.Timer类 ...
- 零基础快速入门SpringBoot2.0教程 (三)
一.SpringBoot Starter讲解 简介:介绍什么是SpringBoot Starter和主要作用 1.官网地址:https://docs.spring.io/spring-boot/doc ...
- SpringBoot整合定时任务和异步任务处理
SpringBoot定时任务schedule讲解 简介:讲解什么是定时任务和常见定时任务区别 1.常见定时任务 Java自带的java.util.Timer类 timer:配置比较麻烦,时间延后问题, ...
- java~@Async异步功能
@Async注解,可以实现异步处理的功能,它可以有返回值,或者直接在新线程时并行执行一个任务,对于异步来说,它的执行是有条件的,你需要把异步代码块放在单独的类里,当spring在注入时,才不会相互影响 ...
- SpringBoot实现异步
1.创建AsyncTest类 package com.cppdy.service; import org.springframework.scheduling.annotation.Async; im ...
随机推荐
- Spring Cloud Hystrix 学习(三)请求合并
什么是请求合并?我们先来看两张图: 上方的两张图中,第二张可以看出服务端只执行了一次响应,这就是请求合并.客户端新增的请求合并模块,内部存在一个等待的时间窗口,将一定时间段内满足条件的请求进行合并,以 ...
- 一文让你彻底理解SQL关联子查询
员工表的主要信息: 需求:检索工资大于同职位的平均工资的员工信息. 直觉的做法 员工多,而相应的职位(如销售员.经理.部门经理等)少,因此首先想到的思路是对职位分组,这样就能分别得到各个职位的平均工资 ...
- Redis-Cluster分片扩容
redis分片分片场景在业务量相对较小的时候,可以将所有数据都存到一台机器上,只使用redis单机模式,不存在分片问题.如果业务的数据量超过一台物理机器的内存大小时,则会面对扩展问题,需要多台机器去存 ...
- Excel备忘录
1. 导入文本文件(.txt) 2. 排序 3. 批量填充空白 选定区域,Ctrl+G,定位,空值. 输入内容,Ctrl+Enter. 4. 清除无法修改的背景色. 5. 身份证号 数字精度为15位, ...
- Redis5种常用数据类型的使用以及内部编码
String 字符串类型是redis的最基本类型,首先无论值是什么数据类型,其键都是字符串,且其他数据类型的数据结构都是在字符串的基础上搭建的,相信读者能够体会到字符串在redis的地位是有多么的重要 ...
- 从0到1使用Kubernetes系列——Kubernetes入门
基本概念 Docker 是什么 Docker 起初是 dotCloud 公司创始人 Solomon Hykes 在法国的时候发起的一项公司内部项目,Docker 是基于 dotCloud 公司多年云服 ...
- Serverless 的初心、现状和未来
作者 | 不瞋 导读:Serverless 是如何产生的?当前有哪些落地场景?Serverless 的未来又将如何?本文分享了阿里云高级技术专家不瞋对于 Serverless 的看法,回顾其发展历程, ...
- 开发函数计算的正确姿势——OCR 服务
作者 | 杜万(倚贤) 阿里云技术专家 简介 首先介绍下在本文出现的几个比较重要的概念: OCR(光学字符识别):光学字符识别(Optical Character Recognition, OCR)是 ...
- 1. SSTI(模板注入)漏洞(入门篇)
好久没更新博客了,现在主要在作源码审计相关工作,在工作中也遇到了各种语言导致的一些SSTI,今天就来大概说一下SSTI模板注入这个老生常谈的漏洞 前言 模板引擎 模板引擎(这里特指用于Web开发的模板 ...
- FastAPI 学习之路(二十七)安全校验
你写API接口肯定你是希望是有权限的人才能访问,没有权限的人是不能访问的,那么我们应该如何去处理呢,我们可以用的验证方式有很多,我们这次分享的是用:OAuth2来认证.那么我们看下,需要怎么才能实现呢 ...