Spring Boot对Future模式的支持详解
前言
我们在实际项目中有些复杂运算、耗时操作,就可以利用多线程来充分利用CPU,提高系统吞吐量。SpringBoot对多线程支持非常好,对我们的开发非常便捷。
Future模式是多线程开发中非常常见的一种设计模式。核心思想是异步调用。当我们执行一个方法时,方法中有多个耗时任务需要同时去做,而且又不着急等待这个结果时可以让客户端立即返回然后,后台慢慢去计算任务。
当我们做一件事的时候需要等待,那么我们就可以在这个等待时间内来去做其它事情,这样就可以充分利用时间。比如我们点外卖,需要一段时间,那么我们在等外卖的时间里可以看点书,看个电影。这就是典型的Future模式。如果是普通模式的话,就是等外卖的时候就等外卖,外卖到了后再去看书,极大的浪费时间。
SpringBoot对Future模式支持非常好,只需要简单的代码就能实现。
1.Future的相关方法
- booleancancel(booleanmayInterruptIfRunning);//可以在任务执行过程中取消任务
- booleanisCancelled();//判断Future任务是否取消
- booleanisDone();//判断任务是否完成
- Vget();//获取任务最终结果,这是一个阻塞方法,会等待任务执行好才会执行后面的代码
- Vget(longtimeout,TimeUnitunit);//有等待时常的get方法,等待时间到了后仍然没有计算完成,则抛异常
2.需要的注解
springboot配置多线程需要两个注解
1、@EnableAsync
在配置类中通过加@EnableAsync开启对异步任务的支持
2、@Async
在需要执行的方法上加@Async表明该方法是个异步方法,如果加在类级别上,则表明类所有的方法都是异步方法
3.配置代码
@Configuration @EnableAsync publicclassAsyncConfigimplementsAsyncConfigurer{ @Override publicExecutorgetAsyncExecutor(){ ThreadPoolTaskExecutortaskExecutor=newThreadPoolTaskExecutor(); //核心线程数 taskExecutor.setCorePoolSize(8); //最大线程数 taskExecutor.setMaxPoolSize(16); //队列大小 taskExecutor.setQueueCapacity(100); taskExecutor.initialize(); returntaskExecutor; } }
4.FutureService
@Service publicclassFutureService{ @Async publicFuturefutureTest()throwsInterruptedException{ System.out.println("任务执行开始,需要:1000ms"); for(inti=0;i<10;i++){ Thread.sleep(100); System.out.println("do:"+i); } System.out.println("完成任务"); returnnewAsyncResult<>(Thread.currentThread().getName()); } }
【注】这里的方法自动被注入使用上文配置的ThreadPoolTaskExecutor
5.测试代码
@Resource privateFutureServicefutureService; @Test publicvoidfutureTest()throwsInterruptedException,ExecutionException{ longstart=System.currentTimeMillis(); System.out.println("开始"); //耗时任务 Futurefuture=futureService.futureTest(); //另外一个耗时任务 Thread.sleep(500); System.out.println("另外一个耗时任务,需要500ms"); Strings=future.get(); System.out.println("计算结果输出:"+s); System.out.println("共耗时:"+(System.currentTimeMillis()-start)); }
6.运行结果
开始
2019-01-0723:50:34.726INFO14648---[main]o.s.s.concurrent.ThreadPoolTaskExecutor:InitializingExecutorService
任务执行开始,需要:1000ms
do:0
do:1
do:2
do:3
另外一个耗时任务,需要500ms
do:4
do:5
do:6
do:7
do:8
do:9
完成任务
计算结果输出:ThreadPoolTaskExecutor-1
共耗时:1016Processfinishedwithexitcode0
本来需要至少1500ms执行的任务现在只需要1016ms,因为在执行耗时任务1的同时也在执行耗时任务2,两个任务并行执行,这就是future模式的好处,在等待时间内去执行其它任务,能够充分利用时间
【注】本文基于SpringBoot2.0
GitHub连接
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。