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 ...
随机推荐
- Java基础系列(9)- 数据类型扩展及常见面试题
整数拓展 // 整数拓展: 进制 二进制0b 十进制 八进制0 十六进制0x // 同一个数字在不同进制中,结果是不同的,进制换算 int i = 10; int i2 = 010; // 八进制 i ...
- Jmeter扩展组件开发(8) - 函数助手扩展开发demo
前提条件 1.pom文件引用ApacheJMeter_functions包 <dependency> <groupId>org.apache.jmeter</groupI ...
- Docker系列(8)- 常用其他命令(1) | 日志、元数据、进程的查看
后台启动容器 # 命令 docker run -d 镜像名 [root@localhost ~]# docker run -d centos #问题:docker ps,发现centos停止了 #常见 ...
- Linux系类(8) - 文件搜索命令locate
文件搜索命令locate 命令格式 locate [文件名] 在后台数据库中按文件名搜索,搜索速度更快,而find.which是遍历所有目录去查找:后台数据库在/var/lib/mlocate (保存 ...
- win10系统显示此电脑
今天电脑开机后发现从任务栏进入"文件资源管理器",直接卡死,重启电脑也没有用. 我想到是不是从"此电脑"进入不会卡死,试了一下果真没有卡死. 使用win10系统 ...
- python之jsonpath
json 官方文档:http://docs.python.org/library/json.html JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,它使 ...
- shell加密为二进制可执行文件
1.下载shc工具 http://www.datsi.fi.upm.es/~frosal/sources/shc-3.8.9.tgz或者到http://www.datsi.fi.upm.es/~fro ...
- LR进行内外网附件上传并发——实践心得
刚开始接触LR的时候,做了一次内外网附件上传的并发测试,比较简单,但当时理解有些欠缺.以下为当时的实践心得: 1.分内外网测试的意义: 内网测试主要看负载压力情况等,外网测试主要考虑网络带宽.网络延时 ...
- 『GoLang』函数
函数介绍 Go语言函数基本组成包括: 关键字func 函数名 参数列表 返回值 函数体 返回语句 语法如下: func 函数名(参数列表) (返回值列表) { // 函数体 return } 除了ma ...
- 鸿蒙内核源码分析(内存汇编篇) | 谁是虚拟内存实现的基础 | 百篇博客分析OpenHarmony源码 | v14.14
百篇博客系列篇.本篇为: v14.xx 鸿蒙内核源码分析(内存汇编篇) | 谁是虚拟内存实现的基础 | 51.c.h .o 内存管理相关篇为: v11.xx 鸿蒙内核源码分析(内存分配篇) | 内存有 ...