Java异步线程中的CompletableFuture与@Async详解

 更新时间:2024年01月19日 09:12:44   作者:景庆197  
这篇文章主要介绍了Java异步线程中的CompletableFuture与@Async详解,CompletableFuture是java中提供的一个异步执行类,@Async是Spring提供的异步执行方法,当调用方法单独开启一个线程进行调用,需要的朋友可以参考下

引言

1.CompletableFuture是java中提供的一个异步执行类,@Async是Spring提供的异步执行方法,当调用方法单独开启一个线程进行调用。

2.@Async通常指定一个方法使用的异步方法调用,而CompletableFuture可以一个方法体内对请求体进行排序组合成链式调用再返回

1.@Async的使用

@Async的粒度比较大,在使用的时候只能添加到方法上,并且需要自定义线程池。

实现:

需要在配置类上添加@Configuration

需要实现AsyncConfigure接口,里面有两个方法可以重写[getAsyncExecutor,getAsyncUncaughtExceptionHandler],主要实现的方法是getAsyncExecutor(),

我们当时实现手动注入一个@Bean。

ps:ThreadPoolTaskExecutor设计模式是:模板方法和策略模式

代码实现:

@Configuration
@EnableAsync
public class AsyncTaskConfig implements AsyncConfigurer {
    @Override
    @Bean
    public Executor getAsyncExecutor() {
        /**
         * ThreadPoolExecutor通用线程池
         * ThreadPoolTaskExecutor 是再ThradPoolExecutor上面做增强,支持业务执行任务、支持定时任务、spring的线程管理等
         */
        ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
        threadPoolTaskExecutor.setCorePoolSize(10);
        threadPoolTaskExecutor.setMaxPoolSize(100);
        threadPoolTaskExecutor.setQueueCapacity(10);
        // 设置线程池全部结束的时候才完全关闭线程
        threadPoolTaskExecutor.setWaitForTasksToCompleteOnShutdown(true);
        // 当线程关闭的时候需要等待多长时间才进行关闭
        threadPoolTaskExecutor.setAwaitTerminationSeconds(60);
        // 设置线程的名字
        threadPoolTaskExecutor.setThreadNamePrefix("Rabbit-Async-");
        // 进行初始化
        threadPoolTaskExecutor.initialize();
        return threadPoolTaskExecutor;
    }
// 需要实现AsynConfiguration的两个方法
    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        return null;
    }
}

2.CompletableFuture总体架构

Future 它是java5添加的接口,用来描述一个异步计算的结果,可以用isDone方法来计算是否完成,或者使用get阻塞往效用线程,直到计算返回结果,可以使用Cancel方法停止任务执行。

CompletableFuture实现Furure接口,不推荐使用get方式阻塞或者轮询方式获取结果。

CompletableFuture.supplyAsync(Runnable,Executor);//支持返回值

CompletableFutre.runAsync(Runnable,Executor);//不支持返回值

3.计算完成时回调方法

whenComplete(BigConsumer):同步完成正常处理结果

whenCompleteAsync(BigConsumer):异步完成处理结果

whenCompleteAysnc(BigConsumer,Executor):异步完成处理结果

exceptionally(Function):处理异常结果

串行化与并行化

串行化:程序从上到下执行的都是一个循序

并行化:从上到下执行顺序不一定

串行化案例

thenApply方法(有返回值):当一个线程依赖另一个线程是,获取上一个任务返回结果,并返回当前任务的返回值

thenAccept方法(无返回值):接受任务的处理结果,并消费处理,无返回值结果。

thenRun方法(最后执行):只有上面的任务执行完成,就开始执行thenRun,只是处理完任务后执行thenRun的后续操作。

 并行化案例:

多任务组合

allof().join();:等待所有任务完成之后返回

anyof():只有一个任务完成

到此这篇关于Java异步线程中的CompletableFuture与@Async详解的文章就介绍到这了,更多相关CompletableFuture与@Async内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot详解Banner的使用

    SpringBoot详解Banner的使用

    这篇文章主要介绍了超个性修改SpringBoot项目的启动banner的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • java集合 ArrayDeque源码详细分析

    java集合 ArrayDeque源码详细分析

    ArrayDeque是一种以数组方式实现的双端队列,它是非线程安全的。下面小编和大家一起学习一下
    2019-05-05
  • Spring Cloud Gateway组件的三种使用方式实例详解

    Spring Cloud Gateway组件的三种使用方式实例详解

    Spring Cloud Gateway是 Spring 官方基于 Spring5.0 、 SpringBoot2.0 和 Project Reactor 等技术开发的网关旨在为微服务框架提供一种简单而有效的统一的API 路由管理方式,统一访问接口,这篇文章主要介绍了Spring Cloud Gateway组件的三种使用方式,需要的朋友可以参考下
    2024-01-01
  • 解决Spring MVC中文乱码的编码配置

    解决Spring MVC中文乱码的编码配置

    这篇文章主要为大家介绍了解决SpringMVC中文乱码的编码配置示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • 详解Jvm中时区设置方式

    详解Jvm中时区设置方式

    这篇文章主要介绍了详解Jvm中时区设置方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Java枚举类型深度详解

    Java枚举类型深度详解

    Java的枚举类型(enum)是一种强大的工具,它不仅可以让你的代码更简洁、可读,而且通过类型安全、常量集合、方法重写和接口实现等特性,使得枚举在很多场景下都非常有用,本文给大家介绍Java枚举类型详解,感兴趣的朋友跟随小编一起看看吧
    2025-11-11
  • SpringBoot 3.5 集成 Knife4j 4.3的详细步骤

    SpringBoot 3.5 集成 Knife4j 4.3的详细步骤

    这篇文章给大家介绍SpringBoot3.5集成Knife4j 4.3步骤,本文分步骤结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2026-04-04
  • Java异常简介和架构_动力节点Java学院整理

    Java异常简介和架构_动力节点Java学院整理

    这篇文章主要分享了Java异常简介和架构,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • java实战小技巧之字符串与容器互转详解

    java实战小技巧之字符串与容器互转详解

    Java.lang.String是Java的字符串类. Srting是一个不可变对象,下面这篇文章主要给大家介绍了关于java实战小技巧之字符串与容器互转的相关资料,需要的朋友可以参考下
    2021-08-08
  • Spring整合JPA与Hibernate流程详解

    Spring整合JPA与Hibernate流程详解

    这篇文章主要介绍了Spring整合Hibernate与JPA,在正式进入Hibernate的高级应用之前,需要了解声明是数据模型与领域模型,这两个概念将会帮助我们更好的理解实体对象的关联关系映射
    2023-01-01

最新评论