Spring Boot对Future模式的支持详解

 更新时间:2019年01月11日 10:14:07   作者:Zejun-Liu  
这篇文章主要给大家介绍了关于Spring Boot对Future模式的支持的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用spring boot具有一定的参考学习价值,需要的朋友们下面来一起看看吧

前言

我们在实际项目中有些复杂运算、耗时操作,就可以利用多线程来充分利用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);
 }
 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 = future.get();
 System.out.println("计算结果输出:" + s);
 System.out.println("共耗时:" + (System.currentTimeMillis() - start));
}

6.运行结果

开始
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

GitHub 连接

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • Spring Boot实现模块化的几种方法

    Spring Boot实现模块化的几种方法

    模块可以是业务模块,为应用程序提供一些业务服务,或者为几个其他模块或整个应用程序提供跨领域关注的技术模块。这篇文章主要介绍了Spring Boot实现模块化,需要的朋友可以参考下
    2018-07-07
  • Java Vector实现班级信息管理系统

    Java Vector实现班级信息管理系统

    这篇文章主要为大家详细介绍了Java Vector实现班级信息管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • @PostConstruct在项目启动时被执行两次或多次的原因及分析

    @PostConstruct在项目启动时被执行两次或多次的原因及分析

    这篇文章主要介绍了@PostConstruct在项目启动时被执行两次或多次的原因及分析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • java迭代器和for循环优劣详解

    java迭代器和for循环优劣详解

    在本篇文章里小编给大家整理的是一篇关于java迭代器和for循环优劣详解内容,对此有兴趣的朋友们可以学习参考下。
    2021-01-01
  • 基于java实现websocket协议过程详解

    基于java实现websocket协议过程详解

    这篇文章主要介绍了基于java实现websocket协议过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • springboot中swagger快速启动流程

    springboot中swagger快速启动流程

    这篇文章主要介绍了springboot中的swagger快速启动流程,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • SpringMVC中controller接收json数据的方法

    SpringMVC中controller接收json数据的方法

    这篇文章主要为大家详细介绍了SpringMVC中controller接收json数据的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • Java中的自旋锁与适应性自旋锁的区别

    Java中的自旋锁与适应性自旋锁的区别

    这篇文章主要介绍了Java中的自旋锁与适应性自旋锁的区别,当一个线程尝试去获取某一把锁的时候,如果这个锁此时已经被别人获取(占用),那么此线程就无法获取到这把锁,该线程将会等待,间隔一段时间后会再次尝试获取,需要的朋友可以参考下
    2023-10-10
  • java.lang.NoClassDefFoundError错误的原因及解决方法

    java.lang.NoClassDefFoundError错误的原因及解决方法

    这篇文章主要给大家介绍了关于java.lang.NoClassDefFoundError错误的原因及解决的相关资料,java.lang.NoClassDefFoundError是Java虚拟机在运行时无法找到特定类的错误,需要的朋友可以参考下
    2023-10-10
  • Spring创建bean对象三种方式代码实例

    Spring创建bean对象三种方式代码实例

    这篇文章主要介绍了Spring创建bean对象三种方式代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07

最新评论