启动类:添加@EnableAsync注解

@SpringBootApplication

@EnableAsync

public class Application{

  public static void main(String[] args) {

    SpringApplication.run(Application.class, args);

  }

}

Controller类

@RequestMapping("")

@RestController
public class AsyncTaskController {

  @Autowired
  private AsyncTask asyncTask;

  @RequestMapping("")
  public String doTask() throws InterruptedException{
    long currentTimeMillis = System.currentTimeMillis();
    Future<String> task1 = asyncTask.task1();

    Future<String> task2 = asyncTask.task2();
    Future<String> task3 = asyncTask.task3();
    String result = null;
    for (;;) {
      if(task1.isDone() && task2.isDone() && task3.isDone()) {
      // 三个任务都调用完成,退出循环等待
      break;
      }
      Thread.sleep(1000);
    }

    long currentTimeMillis1 = System.currentTimeMillis();

    result = "task任务总耗时:"+(currentTimeMillis1-currentTimeMillis)+"ms";
    return result;

  }
}

异步任务类
@Component
public class AsyncTask {

  @Async
  public Future<String> task1() throws InterruptedException{
    long currentTimeMillis = System.currentTimeMillis();
    Thread.sleep(1000);
    long currentTimeMillis1 = System.currentTimeMillis();
    System.out.println("task1任务耗时:"+(currentTimeMillis1-currentTimeMillis)+"ms");

    return new AsyncResult<String>("task1执行完毕");
  }

  @Async
  public Future<String> task2() throws InterruptedException{
    long currentTimeMillis = System.currentTimeMillis();
    Thread.sleep(2000);
    long currentTimeMillis1 = System.currentTimeMillis();
    System.out.println("task2任务耗时:"+(currentTimeMillis1-currentTimeMillis)+"ms");

     return new AsyncResult<String>("task2执行完毕");
  }

  @Async
  public Future<String> task3() throws InterruptedException{
    long currentTimeMillis = System.currentTimeMillis();
    Thread.sleep(3000);
    long currentTimeMillis1 = System.currentTimeMillis();
    System.out.println("task3任务耗时:"+(currentTimeMillis1-currentTimeMillis)+"ms");

      return new AsyncResult<String>("task3执行完毕");
  }

}

结果:

  1. task1任务耗时:1000ms
  2.  task2任务耗时:2001ms
  3.  task3任务耗时:3001ms

  task任务总耗时:4015ms

springboot-异步线程调用的更多相关文章

  1. springboot异步线程(二)

    前言 本篇文章针对上篇文章springboot异步线程,有一位大佬在评论中提出第一点是错误的,当时看到了这个问题,最近刚好有空,针对第一点的问题去搜索了不少的文章: 问题 我在文章中第一点去验证:Sc ...

  2. SpringBoot 异步线程简单三种样式

    引用:在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的:但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实,在Spring 3.x ...

  3. springboot异步线程

    前言 最近项目中出现了一个问题,发现自己的定时器任务在线上没有执行,但是在线下测试时却能执行,最后谷歌到了这篇文章SpringBoot踩坑日记-定时任务不定时了?; 本篇文章主要以自己在项目中遇到的问 ...

  4. SpringBoot学习笔记(七):SpringBoot使用AOP统一处理请求日志、SpringBoot定时任务@Scheduled、SpringBoot异步调用Async、自定义参数

    SpringBoot使用AOP统一处理请求日志 这里就提到了我们Spring当中的AOP,也就是面向切面编程,今天我们使用AOP去对我们的所有请求进行一个统一处理.首先在pom.xml中引入我们需要的 ...

  5. SpringBoot使用异步线程池实现生产环境批量数据推送

    前言 SpringBoot使用异步线程池: 1.编写线程池配置类,自定义一个线程池: 2.定义一个异步服务: 3.使用@Async注解指向定义的线程池: 这里以我工作中使用过的一个案例来做描述,我所在 ...

  6. springboot 中如何正确在异步线程中使用request

    起因: 有后端同事反馈在异步线程中获取了request中的参数,然后下一个请求是get请求的话,发现会偶尔出现参数丢失的问题. 示例代码: @GetMapping("/getParams&q ...

  7. 卸载AppDomain动态调用DLL异步线程执行失败

    应用场景 动态调用DLL中的类,执行类的方法实现业务插件功能 使用Assembly 来实现 但是会出现逻辑线程数异常的问题 使用AppDomain 实现动态调用,并卸载. 发现问题某个插件中开启异步线 ...

  8. c#异步线程:同步调用,异步调用,异步回调

    定义一个异步线程类: public class AsyEventClass { private static ILog logger = LogManager.GetLogger(MethodBase ...

  9. SpringBoot异步调用--@Async详解

    1. 概述   在日常开发中,为了提高主线程的效率,往往需要采用异步调用处理,例如系统日志等.在实际业务场景中,可以使用消息中间件如RabbitMQ.RocketMQ.Kafka等来解决.假如对高可用 ...

  10. SpringBoot异步使用@Async原理及线程池配置

    前言 在实际项目开发中很多业务场景需要使用异步去完成,比如消息通知,日志记录,等非常常用的都可以通过异步去执行,提高效率,那么在Spring框架中应该如何去使用异步呢 使用步骤 完成异步操作一般有两种 ...

随机推荐

  1. Servlet 表单数据 接收get post 参数实例

    Servlet 表单数据 很多情况下,需要传递一些信息,从浏览器到 Web 服务器,最终到后台程序.浏览器使用两种方法可将这些信息传递到 Web 服务器,分别为 GET 方法和 POST 方法. GE ...

  2. 阶段3 3.SpringMVC·_06.异常处理及拦截器_6 SpringMVC拦截器之拦截器入门代码

    创建拦截器 新建包 实现拦截器的接口 接口中没有强制实现里面的方法.jdk1.8的特性.接口中已经实现了方法 这就是相当于实现了这个接口.方法已经全帮你实现过了. 如果想去写新的实现方法.Ctrl+o ...

  3. CMD(命令提示符)-------javac编译程序出现“”编码GBK的不可映射字符“”

    问题描述:使用命令提示符(CMD)编译写好的java程序的时候出现“编码GBK的不可映射字符” 问题截图: 问题分析:看提示就知道是代码的注释出现问题,但注释格式完全正确,那么问题就只可能是注释编码出 ...

  4. phpstorm 远程连接服务器进行开发

    phpstorm phpstorm是一款功能强大的ide编辑器,有了它,你敲代码速度能比用notepad++快数倍(初学者不建议使用ide,建议使用notepad++),缺点是没有固态的电脑带起来吃力 ...

  5. Opencv实现的陷波滤波器

    在本示例中,共设计了三个函数,分别是巴特沃斯滤波器BLPF().巴特沃斯陷波滤波器notchFilter_BTW().高斯陷波滤波器notchFilter_GAUSS() 巴特沃斯陷波滤波器参见书上6 ...

  6. Django-ORM之ManyToManyField的使用-多对多关系

    表结构设计 多对多关系表创建外键,典型例子:书--作者--出版社,书与作者的关系就可以看作是多对多关系. # 表结构设计 class Book(models.Model): title = model ...

  7. PHP7 开启Zend Opcache

    PHP7 开启Zend Opcache 作为PHP这10年来最大的版本与性能升级,PHP7在多次的测试中都表现出很夸张的性能提升,然而,为了让它能发挥出最大的性能,需要手动开启PHP自带的opcach ...

  8. ng-zorro等组件默认样式的修改

    https://www.jianshu.com/p/8b887c2aac06 在项目中修改ng-zorro组件默认样式的一些方法: 类名等 前加::ng-deep: 类名等 前加:root: 类名等 ...

  9. 2019牛客暑期多校训练营(第二场)-H Second Large Rectangle(次大子矩阵,降维,直方图+单调栈)

    题目链接:https://ac.nowcoder.com/acm/contest/882/H 题目:给n×m的由01组成的矩阵,求次大全1子矩阵的大小. 思路:第一步还是降维操作,用a[i][j]记录 ...

  10. [转帖]深入浅出全面解析RDMA

    深入浅出全面解析RDMA 置顶 2018年06月04日 11:36:54 MasterT-J 阅读数 17193更多 所属专栏: RDMA   RDMA(RemoteDirect Memory Acc ...