异步调用

异步调用

采用多线程来处理避免程序卡顿,一般都是用在service 层
异步调用_第1张图片

  1. 接口类
    在这里插入图片描述
 public interface EnableAsync {
     
 //Future是jdk提供的一种类型
    Future<String> task1() throws Exception;
    Future<String> task2() throws Exception;
    Future<String> task3() throws Exception;
}
  1. 实现类
    在这里插入图片描述
@Service
public class EnableAsyncImpl implements EnableAsync {
     
 private static Random Random = new Random();
 
 @Async//业务类功能必须开启异步执行的注解
 @Override
 public Future<String> task1() throws Exception {
     
  System.out.println("任务1开始");
   long start = System.currentTimeMillis();
   Thread.sleep(Random.nextInt(10000));
   long end = System.currentTimeMillis();
   System.out.println("总耗时"+(end-start)+"毫秒");
   //AsyncResult 是Futuer的一个子类
   return new AsyncResult<String>("任务一结束");
 }

 @Async
 @Override
 public Future<String> task2() throws Exception {
     
   System.out.println("任务2开始");
   long start = System.currentTimeMillis();
   Thread.sleep(Random.nextInt(10000));
   long end = System.currentTimeMillis();
   System.out.println("总耗时"+(end-start)+"毫秒");
  return new AsyncResult<String>("任务2结束");
 }

 @Async
 @Override
 public Future<String> task3() throws Exception {
     
  System.out.println("任务3开始");
  long start = System.currentTimeMillis();
  Thread.sleep(Random.nextInt(10000));
  long end = System.currentTimeMillis();
  System.out.println("总耗时"+(end-start)+"毫秒");
  return new AsyncResult<String>("任务3结束");
 }
}
  1. controller
    在这里插入图片描述
@RestController
public class AsyncController {
     
 @Autowired
 private EnableAsync async;
 @RequestMapping("async")
 public String asyncTest() throws Exception{
     
  long start = System.currentTimeMillis();
  Future<String> task1 = async.task1();
  Future<String> task2 = async.task2();
  Future<String> task3 = async.task3();
  
  //判断这些子线程什么时候结束
  while(true){
     
   
   if(task1.isDone()&& task2.isDone()&&task3.isDone()){
     
    break;
   }
   Thread.sleep(1000);// 让当前线程先休息
  }
     long end=System.currentTimeMillis();
  return "总耗时"+(end- start);
  }
}
  1. 启动类
    在这里插入图片描述
@EnableAsync// 在启动类中必须开启此注解,开启异步执行功能
@SpringBootApplication(scanBasePackages={
     "com.EnableAsync.Controller","com.EnableAsync.Service","com.EnableAsync.ServiceImpl"})
public class test {
     
 public static void main(String[] args) {
     
  SpringApplication.run(test.class, args);
 }
}
  1. 结果
    异步调用_第2张图片异步调用_第3张图片

你可能感兴趣的:(spring,boot,多线程)