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";
}
}