SpringBoot对Future模式的⽀持详解
前⾔
我们在实际项⽬中有些复杂运算、耗时操作,就可以利⽤多线程来充分利⽤CPU,提⾼系统吞吐量。SpringBoot对多线程⽀持⾮常好,对我们的开发⾮常便捷。
Future模式是多线程开发中⾮常常见的⼀种设计模式。核⼼思想是异步调⽤。当我们执⾏⼀个⽅法时,⽅法中有多个耗时任务需要同时去做,⽽且⼜不着急等待这个结果时可以让客户端⽴即返回然后,后台慢慢去计算任务。
当我们做⼀件事的时候需要等待,那么我们就可以在这个等待时间内来去做其它事情,这样就可以充分利⽤时间。⽐如我们点外卖,需要⼀段时间,那么我们在等外卖的时间⾥可以看点书,看个电影。这就是典型的Future模式。如果是普通模式的话,就是等外卖的时候就等外卖,外卖到了后再去看书,极⼤的浪费时间。
SpringBoot对Future模式⽀持⾮常好,只需要简单的代码就能实现。
1.Future的相关⽅法
boolean cancel(boolean mayInterruptIfRunning);//可以在任务执⾏过程中取消任务
boolean isCancelled();//判断Future任务是否取消
boolean isDone();//判断任务是否完成
V get();//获取任务最终结果,这是⼀个阻塞⽅法,会等待任务执⾏好才会执⾏后⾯的代码
V get(long timeout, TimeUnit unit);//有等待时常的get⽅法,等待时间到了后仍然没有计算完成,则抛异常
2.需要的注解
springboot 配置多线程需要两个注解
1、@EnableAsync
在配置类中通过加@EnableAsync开启对异步任务的⽀持
2、@Async
在需要执⾏的⽅法上加@Async表明该⽅法是个异步⽅法,如果加在类级别上,则表明类所有的⽅法都是异步⽅法
3.配置代码
@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;
}
}
4.FutureService
@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);
spring boot原理和设计模式}
System.out.println("完成任务");
return new AsyncResult<>(Thread.currentThread().getName());
}
}
【注】这⾥的⽅法⾃动被注⼊使⽤上⽂配置的ThreadPoolTaskExecutor
5.测试代码
@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 = ();
System.out.println("计算结果输出:" + s);
System.out.println("共耗时:" + (System.currentTimeMillis() - start));
}
6.运⾏结果
开始
2019-01-07 23:50:34.726 INFO 14648 --- [ main] o.urrent.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
总结
以上就是这篇⽂章的全部内容了,希望本⽂的内容对⼤家的学习或者⼯作具有⼀定的参考学习价值,如果有疑问⼤家可以留⾔交流,谢谢⼤家对的⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。