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 ...
随机推荐
- django 安装与配置-01
安装命令 sudo pip install django python 可以引入django说明已经安装成功 查看django的版本 查看django管理命令 django-admin django创 ...
- 鸿蒙内核源码分析(静态链接篇) | 完整小项目看透静态链接过程 | 百篇博客分析OpenHarmony源码 | v54.01
百篇博客系列篇.本篇为: v54.xx 鸿蒙内核源码分析(静态链接篇) | 完整小项目看透静态链接过程 | 51.c.h.o 下图是一个可执行文件编译,链接的过程. 本篇将通过一个完整的小工程来阐述E ...
- CF280C-Game on Tree【数学期望】
正题 题目链接:https://www.luogu.com.cn/problem/CF280C 题目大意 \(n\)个点的一棵树,每次选择一个没有染色的点把它和它的子树染黑,求期望全部染黑的步数. 解 ...
- YbtOJ#943-平方约数【莫比乌斯反演,平衡规划】
正题 题目链接:http://www.ybtoj.com.cn/contest/122/problem/3 题目大意 \(S(i)\)表示\(i\)的约数个数,\(Q\)次询问给出\(n,m\)求 \ ...
- Dapr + .NET Core实战(六)绑定
什么是绑定 处理外部事件或调用外部接口的功能就是绑定,绑定可以提供以下好处: 避免连接到消息系统 ( 如队列和消息总线 ) 并进行轮询的复杂性 聚焦于业务逻辑,而不是如何与系统交互 使代码不受 SDK ...
- WPF进阶技巧和实战01-小技巧
Svg在WPF中的使用 方法1:拷贝svg中的部分代码转换成Geometry(作为Path的Data使用) 在vs或者直接打开svg,看到如下代码: <?xml version="1. ...
- 实验1:SDN拓扑实践
作业链接:实验1:SDN拓扑实践 一.实验目的 能够使用源码安装Mininet: 能够使用Mininet的可视化工具生成拓扑: 能够使用Mininet的命令行生成特定拓扑: 能够使用Mininet交互 ...
- postgresql高可用集群部署
一.概况 1.概念 pgsql高可用集群采用postgresql+etcd+patroni+haproxy+keepalived等软件实现,以postgresql做数据库,etcd存储集群状态,pat ...
- 一个关于MySQL指定编码实现的小坑
写在前面 环境:MySQL5.7+,MySQL数据库字符编码实现为utf8,表也为utf8 场景:微信授权获取用户信息(包括昵称)并保存到数据库,有的用户成功了,少数用户却失败了 那么为什么会失败呢? ...
- bzoj2064分裂(dp)
题目大意: 给定一个初始集合和目标集合,有两种操作:1.合并集合中的两个元素,新元素为两个元素之和 2.分裂集合中的一个元素,得到的两个新元素之和等于原先的元素.要求用最小步数使初始集合变为目标集合, ...