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的更多相关文章

  1. @Async 异步注释 @EnableAsync

    @SpringBootApplication @ComponentScan(basePackages = "com.fddsfsg") //@EnableSwagger2 @Ena ...

  2. SpringBoot2.0 基础案例(04):定时任务和异步任务的使用方式

    一.定时任务 1.基本概念 按照指定时间执行的程序. 2.使用场景 数据分析 数据清理 系统服务监控 二.同步和异步 1.基本概念 同步调用 程序按照代码顺序依次执行,每一行程序都必须等待上一行程序执 ...

  3. @EnableAsync和@Async开始异步任务支持

    Spring通过任务执行器(TaskExecutor)来实现多线程和并发编程.使用ThreadPoolTaskExecutor可实现一个基于线程池的TaskExecutor.在开发中实现异步任务,我们 ...

  4. 【SpringBoot】整合定时任务和异步任务

    ========================10.SpringBoot整合定时任务和异步任务处理 =============================== 1.SpringBoot定时任务s ...

  5. SpringBoot整合定时任务和异步任务处理 3节课

    1.SpringBoot定时任务schedule讲解   定时任务应用场景: 简介:讲解什么是定时任务和常见定时任务区别 1.常见定时任务 Java自带的java.util.Timer类        ...

  6. 零基础快速入门SpringBoot2.0教程 (三)

    一.SpringBoot Starter讲解 简介:介绍什么是SpringBoot Starter和主要作用 1.官网地址:https://docs.spring.io/spring-boot/doc ...

  7. SpringBoot整合定时任务和异步任务处理

    SpringBoot定时任务schedule讲解 简介:讲解什么是定时任务和常见定时任务区别 1.常见定时任务 Java自带的java.util.Timer类 timer:配置比较麻烦,时间延后问题, ...

  8. java~@Async异步功能

    @Async注解,可以实现异步处理的功能,它可以有返回值,或者直接在新线程时并行执行一个任务,对于异步来说,它的执行是有条件的,你需要把异步代码块放在单独的类里,当spring在注入时,才不会相互影响 ...

  9. SpringBoot实现异步

    1.创建AsyncTest类 package com.cppdy.service; import org.springframework.scheduling.annotation.Async; im ...

随机推荐

  1. django 安装与配置-01

    安装命令 sudo pip install django python 可以引入django说明已经安装成功 查看django的版本 查看django管理命令 django-admin django创 ...

  2. 鸿蒙内核源码分析(静态链接篇) | 完整小项目看透静态链接过程 | 百篇博客分析OpenHarmony源码 | v54.01

    百篇博客系列篇.本篇为: v54.xx 鸿蒙内核源码分析(静态链接篇) | 完整小项目看透静态链接过程 | 51.c.h.o 下图是一个可执行文件编译,链接的过程. 本篇将通过一个完整的小工程来阐述E ...

  3. CF280C-Game on Tree【数学期望】

    正题 题目链接:https://www.luogu.com.cn/problem/CF280C 题目大意 \(n\)个点的一棵树,每次选择一个没有染色的点把它和它的子树染黑,求期望全部染黑的步数. 解 ...

  4. YbtOJ#943-平方约数【莫比乌斯反演,平衡规划】

    正题 题目链接:http://www.ybtoj.com.cn/contest/122/problem/3 题目大意 \(S(i)\)表示\(i\)的约数个数,\(Q\)次询问给出\(n,m\)求 \ ...

  5. Dapr + .NET Core实战(六)绑定

    什么是绑定 处理外部事件或调用外部接口的功能就是绑定,绑定可以提供以下好处: 避免连接到消息系统 ( 如队列和消息总线 ) 并进行轮询的复杂性 聚焦于业务逻辑,而不是如何与系统交互 使代码不受 SDK ...

  6. WPF进阶技巧和实战01-小技巧

    Svg在WPF中的使用 方法1:拷贝svg中的部分代码转换成Geometry(作为Path的Data使用) 在vs或者直接打开svg,看到如下代码: <?xml version="1. ...

  7. 实验1:SDN拓扑实践

    作业链接:实验1:SDN拓扑实践 一.实验目的 能够使用源码安装Mininet: 能够使用Mininet的可视化工具生成拓扑: 能够使用Mininet的命令行生成特定拓扑: 能够使用Mininet交互 ...

  8. postgresql高可用集群部署

    一.概况 1.概念 pgsql高可用集群采用postgresql+etcd+patroni+haproxy+keepalived等软件实现,以postgresql做数据库,etcd存储集群状态,pat ...

  9. 一个关于MySQL指定编码实现的小坑

    写在前面 环境:MySQL5.7+,MySQL数据库字符编码实现为utf8,表也为utf8 场景:微信授权获取用户信息(包括昵称)并保存到数据库,有的用户成功了,少数用户却失败了 那么为什么会失败呢? ...

  10. bzoj2064分裂(dp)

    题目大意: 给定一个初始集合和目标集合,有两种操作:1.合并集合中的两个元素,新元素为两个元素之和 2.分裂集合中的一个元素,得到的两个新元素之和等于原先的元素.要求用最小步数使初始集合变为目标集合, ...