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.springboot.demo.task; import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.AsyncResult; import org.springframework.stereotype.Component; import java.util.concurrent.Future; @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); }
3. 在Controller里进行调用
package com.springboot.demo.controller; import com.springboot.demo.task.AsyncTask; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.Mapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.concurrent.Future; @RestController @RequestMapping("/test") 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"; } }
4. 查看耗时
异步任务3耗时: 400毫秒
异步任务2耗时: 700毫秒
异步任务1耗时: 1000毫秒
任务全部完成总耗时: 1024毫秒