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. javascript 高阶函数 currying & uncurrying

    * currying var currying = function(fn) { var args = []; return function() { if (arguments.length === ...

  2. jqGride的基本使用

    1. 定义:jqGrid是一个在jQuery基础上封装一个表格控件,以ajax的方式和服务器端通信. 2. 使用方式: 2.1 项目中引入jqGride的文件: 2.2 搭建开发页面:  2.3 构建 ...

  3. 前端js单元测试 使用mocha、chai、sinon,karma

    karma(因果报应)  提供在浏览器上测试  可以同时跑在多个浏览器下 mocha测试框架  其他测试框架还有Jasmine chai断言库  expect = chai.expect sinon ...

  4. Douban Top 250爬虫

    # Ref: https://fishc.com.cn/forum.php?mod=viewthread&tid=101887&extra=page%3D1%26filter%3Dty ...

  5. JVM-对象的实例化,内存布局与访问定位

    1.对象的实例化 提到对象的实例化,我们可能会想到几个问题.对象在JVM中是怎么存储的?对象里面有什么?接下来,我们就来探讨一下对象的实例化以及回答一下这两个问题. 首先我们用图例来说明对象的实例化: ...

  6. 基于深度学习的建筑能耗预测01——Anaconda3-4.4.0+Tensorflow1.7+Python3.6+Pycharm安装

    基于深度学习的建筑能耗预测-2021WS-02W 一,安装python及其环境的设置 (写python代码前,在电脑上安装相关必备的软件的过程称为环境搭建) · 完全可以先安装anaconda(会自带 ...

  7. div 可编辑--获取光标位置插入元素

    <!DOCTYPE html> <html> <head>     <meta http-equiv="Content-Language" ...

  8. C++ 可变数组实现

    话不多说,直接上代码,看注释 template<class T> // 支持传入泛型,但string这种可变长度的类型还不支持 class Array { int mSize = 0, m ...

  9. 通用脱敏工具类和判断URL

    通用脱敏工具类 public class DesensitizationUtil { private static final int SIZE = 6; private static final S ...

  10. node-pre-gyp以及node-gyp的源码简单解析(以安装sqlite3为例)

    title: node-pre-gyp以及node-gyp的源码简单解析(以安装sqlite3为例) date: 2020-11-27 tags: node native sqlite3 前言 简单来 ...