首页 > 其他分享 >CompletableFuture异步编排接口优化方案

CompletableFuture异步编排接口优化方案

时间:2024-11-05 21:11:43浏览次数:1  
标签:异步 任务 编排 CompletableFuture 线程 执行 threadPoolExecutor

接口优化方案

(1)程序本身,减少不必要的条件判断、循环

(2)减少数据库的交互次数,以及每个sql查询的数据量(列数和行数越少越好)

(3)提高sql的性能,通过建立合适的索引

(4)使用java8的stream流提高集合的遍历操作的效率

(5)引入缓存,从redis中加载数据的效率高于mysql

(6)使用多线程异步编排,将一个大任务拆分成多个小任务并发执行,提高任务处理的效率

多线程异步编排

自定义异步编排

使用join

CompletableFuture

CompletableFuture 是 Java8 引入的一个非常强大的工具类,属于 java.util.concurrent 包,它支持异步编程和并行处理,能够更方便地处理异步计算结果。通过 CompletableFuture,你可以构建一系列异步任务,并在任务完成后执行特定的操作,或处理任务的结果。

常用方法

supplyAsync:supplyAsync是创建带有返回值的异步任务。

runAsync:runAsync是创建没有返回值的异步任务。

thenApply和thenApplyAsync:表示某个任务执行完成后执行的动作,即回调方法,会将该任务的执行结果即方法返回值作为入参传递到回调方法中,带有返回值。

thenApply和thenApplyAsync区别在于,使用thenApply方法时子任务与父任务使用的是同一个线程,而thenApplyAsync在子任务中是另起一个线程执行任务。

thenAccept和thenAcceptAsync:表示某个任务执行完成后执行的动作,即回调方法,会将该任务的执行结果即方法返回值作为入参传递到回调方法中,无返回值。

thenAccep和thenAccepAsync区别在于,使用thenAccep方法时子任务与父任务使用的是同一个线程,而thenAccepAsync在子任务中可能是另起一个线程执行任务。

thenRun和thenRunAsync:表示某个任务执行完成后执行的动作,即回调方法,无入参,无返回值。

allOf / anyOf
allOf:CompletableFuture是多个任务都执行完成后才会执行,只有有一个任务执行异常,则返回的CompletableFuture执行get方法时会抛出异常,如果都是正常执行,则get返回null。

anyOf :CompletableFuture是多个任务只要有一个任务执行完成,则返回的CompletableFuture执行get方法时会抛出异常,如果都是正常执行,则get返回执行完成任务的结果。

1、ThreadPoolConfig

全局自定义线程池配置

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

@Configuration
public class ThreadPoolConfig {

    @Bean
    public ThreadPoolExecutor threadPoolExecutor() {
        //当前系统可用的处理器数量
        int processorsCount = Runtime.getRuntime().availableProcessors();
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
                processorsCount * 2,
                processorsCount * 2,
                0,
                TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(200),
                Executors.defaultThreadFactory(),
                //new ThreadPoolExecutor.CallerRunsPolicy()
                //自定义拒绝策略
                (runnable, executor) -> {
                    try {
                        Thread.sleep(200);
                    } catch (InterruptedException e) {
                    }
                    //再次将拒绝任务提交给线程池执行
                    executor.submit(runnable);
                }
        );
        //线程池创建,核心线程同时创建
        //threadPoolExecutor.prestartCoreThread();
        threadPoolExecutor.prestartAllCoreThreads();
        return threadPoolExecutor;
    }
}

2、使用CompletableFuture

@Autowired
private ThreadPoolExecutor threadPoolExecutor;

public void test() {

    ItemVo itemVo = new ItemVo();
    //获取sku信息
    CompletableFuture<ProductSku> skuCompletableFuture = CompletableFuture.supplyAsync(() -> {
        //代码内容1
        return ProductSku;
    }, threadPoolExecutor);

    //获取商品信息
    CompletableFuture<Void> productComCompletableFuture = skuCompletableFuture.thenAcceptAsync(productSku ->    {  //代码内容2
    }, threadPoolExecutor);

    //获取商品最新价格
    CompletableFuture<Void> skuPriceCompletableFuture = CompletableFuture.runAsync(() -> {
        //代码内容3
    }, threadPoolExecutor);

    //获取商品详情
    CompletableFuture<Void> productDetailsComCompletableFuture = skuCompletableFuture.thenAcceptAsync(productSku -> {
       //代码内容4
    }, threadPoolExecutor);

    //获取商品规格对应商品skuId信息
    CompletableFuture<Void> skuSpecValueComCompletableFuture = skuCompletableFuture.thenAcceptAsync(productSku -> {
        //代码内容5
    }, threadPoolExecutor);

    //获取商品库存信息
    CompletableFuture<Void> skuStockVoComCompletableFuture = CompletableFuture.runAsync(() -> {
       //代码内容6
    }, threadPoolExecutor);

    //x.组合以上七个异步任务
    //多个任务都执行完成后才会执行
    CompletableFuture.allOf(
            skuCompletableFuture,
            productComCompletableFuture,
            skuPriceCompletableFuture,
            productDetailsComCompletableFuture,
            skuSpecValueComCompletableFuture,
            skuStockVoComCompletableFuture
    ).join();
    return itemVo;
}

标签:异步,任务,编排,CompletableFuture,线程,执行,threadPoolExecutor
From: https://www.cnblogs.com/21CHS/p/18528849

相关文章

  • .NET 高性能异步套接字库,支持多协议、跨平台、高并发
    前言.NET生态中有哪些值得推荐的网络通信框架?今天,给大家推荐一个非常优秀的开源项目——NetCoreServer。NetCoreServer是一款.NET开源、免费、快速且低延迟的异步套接字服务器和客户端库。无论是需要搭建高性能的服务端应用,还是开发高效的客户端程序,NetCoreServer都能提供......
  • 异步编程的利之Future模式深入解析(In Depth Analysis of Future Patterns)
     ......
  • playwright异步操作-多标签执行
    #作者:yancy#创建日期:2024/11/210:06#放屁:钱钱钱importasyncioimporttimefromplaywright.async_apiimportasync_playwrightfromplaywright.sync_apiimportsync_playwrightimportrandomasyncdefget_url(page,url):awaitpage.goto(url,timeout......
  • RabbitMQ的解耦、异步、削峰是什么?
    RabbitMQ在分布式系统和微服务架构中起到了重要的作用,其特性可以实现解耦、异步以及削峰,下面是对这三个概念的详细解释:1.解耦解耦是指使系统的不同组件间的依赖关系减少或消失。在使用RabbitMQ时,生产者(发送消息的组件)和消费者(接收和处理消息的组件)不直接交互,而是通过消息队......
  • 介绍使用@reduxjs/toolkit工具包发送异步请求最简便的方式
     1、安装@reduxjs/toolkit工具包pnpmi @reduxjs/toolkitreact-redux2、在src文件夹下新建store文件夹3、在store文件夹下新建index.js文件作为store的入口文件,其次再新建homeReducer.js文件4、homeReducer.js文件中写入以下代码//从@reduxjs/toolkit库中导入crea......
  • 高并发IPC通信实现:HarmonyOS中的异步调用与多线程处理
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。在当今的移动应用开发领域,高并发通信场......
  • 深入解析C#异步编程:await 关键字背后的实现原理
    C#异步编程中await实现原理详解在C#中,async和await关键字用于编写异步代码。本文将详细介绍await的实现原理,包括状态机的生成、回调函数的注册和触发等关键步骤。1.异步方法的基本概念在C#中,async关键字标记一个方法为异步方法,而await关键字用于等待一个异步操作完......
  • 【java】什么是 Future 和 CompletableFuture - 一篇文章快速入门 Java 异步编程
    1.引言在现代Java编程中,异步编程变得越来越重要。随着多核处理器的普及,充分利用多线程可以大大提高程序性能和用户体验。在这种情况下,Future和CompletableFuture成为处理异步任务的核心工具。2.Future是什么?Future的定义及基本概念Future是Java并发库中的接口......
  • 火山引擎VeDI数据服务平台:在电商场景中,如何解决API编排问题?
    一、火山引擎VeDI数据服务平台介绍数据服务平台简介火山引擎VeDI是新一代企业级数据智能平台,基于字节跳动多年的“数据驱动”实践经验,汇集了端到端的数智产品、场景化的行业解决方案和专业的企业数智化转型咨询。旗下大数据研发治理产品DataLeap的数据服务平台(下文简称数据......
  • 【设计模式】异步阻塞、异步回调模式
    1 前言为什么要看这个异步回调呢?是因为我上节在看RocektMQ发送消息的时候,它支持同步、异步、一次性的模式,后两者不会阻塞当前线程,但是看这两者都没用到线程池,那它是如何处理的呢?我们看下三者最后的落点,都是在 NettyRemotingAbstract这个类里://NettyRemotingAbstract#inv......