咱们在实际项目中有些复杂运算、耗时操做,就能够利用多线程来充分利用CPU,提升系统吞吐量。SpringBoot对多线程支持很是好,对咱们的开发很是便捷。java
Future模式是多线程开发中很是常见的一种设计模式。核心思想是异步调用。当咱们执行一个方法时,方法中有多个耗时任务须要同时去作,并且又不着急等待这个结果时可让客户端当即返回而后,后台慢慢去计算任务。git
当咱们作一件事的时候须要等待,那么咱们就能够在这个等待时间内来去作其它事情,这样就能够充分利用时间。好比咱们点外卖,须要一段时间,那么咱们在等外卖的时间里能够看点书,看个电影。这就是典型的Future模式。若是是普通模式的话,就是等外卖的时候就等外卖,外卖到了后再去看书,极大的浪费时间。github
SpringBoot对Future模式支持很是好,只须要简单的代码就能实现。spring
springboot 配置多线程须要两个注解设计模式
@EnableAsyncspringboot
在配置类中经过加@EnableAsync开启对异步任务的支持多线程
@Async异步
在须要执行的方法上加@Async代表该方法是个异步方法,若是加在类级别上,则代表类全部的方法都是异步方法ide
@Configuration @EnableAsync public class AsyncConfig implements AsyncConfigurer { @Override public Executor getAsyncExecutor() { ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); //核心线程数 taskExecutor.setCorePoolSize(8); //最大线程数 taskExecutor.setMaxPoolSize(16); //队列大小 taskExecutor.setQueueCapacity(100); taskExecutor.initialize(); return taskExecutor; } }
@Service public class FutureService { @Async public Future<String> futureTest() throws InterruptedException { System.out.println("任务执行开始,须要:1000ms"); for (int i = 0; i < 10; i++) { Thread.sleep(100); System.out.println("do:" + i); } System.out.println("完成任务"); return new AsyncResult<>(Thread.currentThread().getName()); } }
【注】这里的方法自动被注入使用上文配置的ThreadPoolTaskExecutor测试
@Resource private FutureService futureService; @Test public void futureTest() throws InterruptedException, ExecutionException { long start = System.currentTimeMillis(); System.out.println("开始"); //耗时任务 Future<String> future = futureService.futureTest(); //另一个耗时任务 Thread.sleep(500); System.out.println("另一个耗时任务,须要500ms"); String s = future.get(); System.out.println("计算结果输出:" + s); System.out.println("共耗时:" + (System.currentTimeMillis() - start)); }
开始 2019-01-07 23:50:34.726 INFO 14648 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 任务执行开始,须要:1000ms do:0 do:1 do:2 do:3 另一个耗时任务,须要500ms do:4 do:5 do:6 do:7 do:8 do:9 完成任务 计算结果输出:ThreadPoolTaskExecutor-1 共耗时:1016 Process finished with exit code 0
原本须要至少1500ms 执行的任务如今只须要1016ms, 由于在执行耗时任务1的同时也在执行耗时任务2,两个任务并行执行,这就是future模式的好处,在等待时间内去执行其它任务,可以充分利用时间
【注】本文基于SpringBoot 2.0
<br>