弹簧引导对未来模式的支持详解

  

  

我们在实际项目中有些复杂运算,耗时操作,就可以利用多线程来充分利用CPU,提高系统吞吐量.SpringBoot对多线程支持非常好,对我们的开发非常便捷。
  

  

未来模式是多线程开发中非常常见的一种设计模式。核心思想是异步调用。当我们执行一个方法时,方法中有多个耗时任务需要同时去做,而且又不着急等待这个结果时可以让客户端立即返回然后,后台慢慢去计算任务。
  

  

当我们做一件事的时候需要等待,那么我们就可以在这个等待时间内来去做其它事情,这样就可以充分利用时间。比如我们点外卖,需要一段时间,那么我们在等外卖的时间里可以看点书,看个电影。这就是典型的未来模式。如果是普通模式的话,就是等外卖的时候就等外卖,外卖到了后再去看的书,极大的浪费时间。
  

  

SpringBoot对未来模式支持非常好,只需要简单的代码就能实现。
  

  

  
      <李>布尔取消(布尔mayInterruptIfRunning);//可以在任务执行过程中取消任务李   <李>布尔isCancelled();//判断未来任务是否取消李   <李>布尔结束();//判断任务是否完成李   <李> V get();//获取任务最终结果,这是一个阻塞方法,会等待任务执行好才会执行后面的代码李   <李> V(长超时,TimeUnit unit);//有等待时常的得到方法,等待时间到了后仍然没有计算完成,则抛异常李   
  


  

  

springboot配置多线程需要两个注解

  

1, @EnableAsync
  

  

在配置类中通过加@EnableAsync开启对异步任务的支持
  2,@Async
  

  

在需要执行的方法上加@Async表明该方法是个异步方法,如果加在类级别上,则表明类所有的方法都是异步方法

  

3。配置代码
  

        @ configuration   @EnableAsync   公共类AsyncConfig实现AsyncConfigurer {      @Override   公共执行人getAsyncExecutor () {   ThreadPoolTaskExecutor taskExecutor=new ThreadPoolTaskExecutor ();//核心线程数   taskExecutor.setCorePoolSize (8);//最大线程数   taskExecutor.setMaxPoolSize (16);//队列大小   taskExecutor.setQueueCapacity (100);   taskExecutor.initialize ();   返回taskExecutor;   }   }      

4。FutureService
  

        @ service   公开课FutureService {      @Async   公共FuturefutureTest()抛出InterruptedException {   System.out.println(“任务执行开始,需要:1000 ms”);   for (int i=0;我& lt;10;我+ +){   thread . sleep (100);   system . out。println (“:”+ i);   }   System.out.println(“完成任务”);   返回新AsyncResult<祝辞(Thread.currentThread () . getname ());   }   }      

【注】这里的方法自动被注入使用上文配置的ThreadPoolTaskExecutor

  

5。测试代码
  

        @   私人FutureService FutureService;      @Test   公共空间futureTest()抛出InterruptedException, ExecutionException {   长开始=System.currentTimeMillis ();   System.out.println(“开始”);//耗时任务   Future未来=futureService.futureTest ();//另外一个耗时任务   thread . sleep (500);   System.out.println(“另外一个耗时任务,需要500 ms”);      字符串s=future.get ();   system . out。println(“计算结果输出:”+ s);   system . out。println(“共耗时:“+ (System.currentTimeMillis()——开始));   }      

6。运行结果
  

  
  

开始
  14648 23:50:34.726信息2019-01-07 - - - - - -[主要]o.s.s.concurrent。ThreadPoolTaskExecutor:初始化ExecutorService
  任务执行开始,需要:1000 ms
  做的事:0
  做的事:1
  做的事:2
  做的事:3
  另外一个耗时任务,需要500 ms
  做的事:4
  做的事:5
  做的事:6
  做的事:7
  做的事:8
  做的事:9
  完成任务
  计算结果输出:ThreadPoolTaskExecutor-1
  共耗时:1016

  

过程完成退出代码0

     

本来需要至少1500 ms执行的任务现在只需要1016 ms,因为在执行耗时任务1的同时也在执行耗时任务2,两个任务并行执行,这就是未来模式的好处,在等待时间内去执行其它任务,能够充分利用时间

弹簧引导对未来模式的支持详解