专栏首页北漂的我SpringBoot 整合异步调用方法

SpringBoot 整合异步调用方法

1. 在 SpringBoot 主类上使用 @EnableAsync 注解,开启异步调用功能

package com.codingos.springbootdemo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;

@SpringBootApplication
// 开启异步调用
@EnableAsync
public class SpringBootDemoApplication {

	public static void main(String[] args) {
		SpringApplication.run(SpringBootDemoApplication.class, args);
	}
}

2. 创建异步方法类

注意类上使用 @Component 注解,方法上使用 @Async 注解

以下例子仅用于演示功能

package com.codingos.springbootdemo.task;

import java.util.concurrent.Future;

import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.AsyncResult;
import org.springframework.stereotype.Component;

@Component
public class AsyncTask {

	@Async
	public Future<Boolean> doTask11() throws InterruptedException {
		long start = System.currentTimeMillis();
		Thread.sleep(1000);
		long end = System.currentTimeMillis();
		System.out.println("异步任务1耗时: " + (end - start) + "毫秒");
		return new AsyncResult<Boolean>(true);
	}
	
	@Async
	public Future<Boolean> doTask22() throws InterruptedException {
		long start = System.currentTimeMillis();
		Thread.sleep(700);
		long end = System.currentTimeMillis();
		System.out.println("异步任务2耗时: " + (end - start) + "毫秒");
		return new AsyncResult<Boolean>(true);
	}
	
	@Async
	public Future<Boolean> doTask33() throws InterruptedException {
		long start = System.currentTimeMillis();
		Thread.sleep(400);
		long end = System.currentTimeMillis();
		System.out.println("异步任务3耗时: " + (end - start) + "毫秒");
		return new AsyncResult<Boolean>(true);
	}
}

下面在 Controller 里进行调用演示

package com.codingos.springbootdemo.controller;

import java.util.concurrent.Future;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.codingos.springbootdemo.task.AsyncTask;

@RestController
@RequestMapping("/asyncTask")
public class AsyncTaskController {
	
	@Autowired
	private AsyncTask asyncTask;
	
	@RequestMapping("/test")
	public String testAsyncTask() throws InterruptedException {
		long start = System.currentTimeMillis();
		
		Future<Boolean> a = asyncTask.doTask11();
		Future<Boolean> b = asyncTask.doTask22();
		Future<Boolean> c = asyncTask.doTask33();
		// 三个异步方法都执行结束后再往下执行
		while (!a.isDone() || !b.isDone() || !c.isDone()) {
			if(a.isDone() && b.isDone() && c.isDone()) {
				break;
			}
		}
		
		long end = System.currentTimeMillis();
		System.out.println("任务全部完成总耗时: " + (end-start)+"毫秒");
		return "string";
	}
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Spring Boot 整合定时任务

    1. 在 SpringBoot 主类上使用 @EnableScheduling 开启定时调度任务

    北漂的我
  • SpringBoot 1.5.x 集成 Quartz 任务调度框架

    内存方式任务信息保存在内存中, 停机会丢失, 需手动重新执行, 数据库方式: 任务信息保存在数据库中, 重点是支持集群.

    北漂的我
  • Spring Boot 集成 Freemarker

    2. application.properties 文件中添加 Freemarker 相关配置

    北漂的我
  • solr_架构案例【京东站内搜索】(附程序源代码)

    注意事项:首先要保证部署solr服务的Tomcat容器和检索solr服务中数据的Tomcat容器,它们的端口号不能发生冲突,否则web程序是不可能运行起来的。 ...

    赵小忠
  • spring service层单元测试

    service层测试较简单,目前大多数测试主要是针对public方法进行的。依据测试方法划分,可以分为两种:基于mock的隔离测试和基于dbunit的普通测试。...

    YGingko
  • 代码演示Mybatis-Generator 扩展自定义生成

    Mybatis-Generator 可自动生成Model、Dao、Mapper代码,但其自带生成的代码存在以下问题:

    宜信技术学院
  • 干货分享 | 深度学习零基础进阶大法!

    编者按:新手上路都会有一个疑问,如果自己没有相关基础,如何学习晦涩的专业知识?此前雷锋网编译了《从0到1:我是如何在一年内无师自通机器学习的?》,这篇文章讲述了...

    AI科技评论
  • SpringBoot之Jms

    前言:JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用...

    王念博客
  • IntelliJ系列 ⑤ | IDEA 之 创建Java、Module工程全解

    码神联盟
  • Shiro教程7(整合SSM项目-授权)

      首先授权必须是在认证通过之后才会执行的操作,之前我们在Shiro教程4(授权操作)该教程中讲过,获取权限我们是通过如下方法实现的

    用户4919348

扫码关注云+社区

领取腾讯云代金券