首页 > 其他分享 >异步编排多任务异步执行

异步编排多任务异步执行

时间:2023-05-17 16:35:20浏览次数:42  
标签:异步 allOf completableFutures mapTrack 编排 线程 new CompletableFuture 多任务

参考: https://blog.csdn.net/teachy/article/details/104971814

创建线程池:

/**
     * 自定义线程池
     * int corePoolSize, 核心线程数 = CPU核数
     * int maximumPoolSize,最大线程数 = CPU核数 * 2
     * long keepAliveTime, 等待时间,线程池线程 > 核心线程数,没有新任务等待keepAliveTime之后销毁
     * TimeUnit unit,
     * BlockingQueue<Runnable> workQueue, 任务队列使用ArrayBlockingQueue,固定40长度
     * RejectedExecutionHandler handler,饱和策略: CallerRunsPolicy: 不抛弃任务,也不抛异常,调用执行自己的线程运行任务
     */
    public static ExecutorService executor = new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors(),
            Runtime.getRuntime().availableProcessors() * 2,
            10L, TimeUnit.SECONDS,
            new ArrayBlockingQueue<>(40),new ThreadPoolExecutor.CallerRunsPolicy());

具体多任务:

public Map<String, Object> routeVehicles(LogisticsTransportBillInfoInDTO billInfoInDTO) {
        long startTime = System.currentTimeMillis();
        Map<String, Object> result = new HashMap<>();
        MapTrack mapTrack = new MapTrack();
        List list = new ArrayList();
        CompletableFuture<String>[] completableFutures = new CompletableFuture[billInfoInDTO.getVersion()];
        for (int i = 0; i < billInfoInDTO.getVersion(); i++) {
            final String vno = "陕YH0008" ;
            // 异步执行任务
            CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
                // 车牌号码
                mapTrack.setVno(vno);
                mapTrack.setVco(2);
                mapTrack.setStartAreaCode("431102");
                mapTrack.setEndAreaCode("450324");
                //多个任务
                return sinoiovRemote.transTimeManage(mapTrack);
            },executor);
            completableFutures[i] = future;
        }
        try {
            CompletableFuture<Void> allOf = CompletableFuture.allOf(completableFutures);
            //等待所有结果完成
            allOf.get();
            for (int i = 0; i < completableFutures.length; i++) {
                if (completableFutures[i] != null){
                    // 拿到结果
                    String res = completableFutures[i].get();
                    if (ObjectUtil.isNotEmpty(res)){
                        list.add(JSONUtil.toJsonStr(res));
                    }else {
                        list.add(mapTrack);
                    }
                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            //executor.shutdown();
        }
        result.put("sinoiovList",list);
        long timeout = System.currentTimeMillis() - startTime;
        System.out.println(timeout);
        logger.info("程序耗时: " + timeout);
        return result;
    }

 代码解释:

CompletableFuture.supplyAsync()
Async 异步执行方法
CompletableFuture<Void> allOf = CompletableFuture.allOf(completableFutures);
//同时执行多个任务
CompletableFuture.allOf()
//等待所有结果完成
allOf.get();


标签:异步,allOf,completableFutures,mapTrack,编排,线程,new,CompletableFuture,多任务
From: https://www.cnblogs.com/yxgmagic/p/17409198.html

相关文章

  • vue elementui validate异步校验改成同步校验返回结果
     异步的校验 <script>import{defineComponent,ref}from'vue'exportdefaultdefineComponent({methods:{getFormDataStatus(){letresult=ref(false)this.ruleForm.validate((valid)=>{if(valid){......
  • 使复杂异步方法变为同步。用promise阻塞
    使复杂异步方法变为同步假如有一个functionasyncFather(){awaitA();awaitb()},需要等方法A执行完,再继续往下执行B的代码,而A()中有很多东西,可能会导致异步。则可在A()内写成promise(resolve()),在A()内所有方法执行完毕后,再执行promise的resolve(),使得Father()在等到A()的resole才......
  • 异步消息的传递-回调机制
    1什么是回调软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用、回调和异步调用。同步调用是一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用;回调是一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口;异步调用是一种类似消......
  • C#异步方法async/await的三种返回类型
    有群友问C#异步方法async返回值Task和void的区别?看似简单,但不容易把它们用好。在C#中的异步编程已经成为现代编程的标配,异步方法(async/await)是实现异步编程的一种常用方式。在异步方法中,可以使用Task或void作为返回类型,还可以使用ValueTask返回类型。本文将介绍异步方法中3个......
  • C#异步有多少种实现方式?
    思维导航前言.NET异步编程模式C#异步有四种实现方式参考文章前言微信群里的一个提问引发的这个问题,有同学问:C#异步有多少种实现方式?想要知道C#异步有多少种实现方式,首先我们要知道.NET提供的执行异步操作的三种模式,然后再去了解C#异步实现的方式。.NET异步编程......
  • 三相异步电机基于空间矢量SVPWM的直接转矩 SVPWM- DTC控制
    三相异步电机基于空间矢量SVPWM的直接转矩SVPWM-DTC控制Matlab/Simulink仿真模型(成品)采用SVPWM的直接转矩控制1.转速环、转矩环、磁链环均采用PI控制2.采用空间矢量SVPWM调制3.含磁链观测、转矩控制、开关状态选择等4.相比于传统DTC控制,转矩的脉动更小如图所示ID:8320067452378......
  • 三相异步电机本体模型 Matlab/Simulink仿真模型(成品) 本模型利
    三相异步电机本体模型Matlab/Simulink仿真模型(成品)本模型利用数学公式搭建了三相异步电机的模型,可以很好的模拟三相异步电机的运行性能,适合研究电机本体时修改参考,电机的各波形都很好可以很好的模拟三相电机ID:1550674841299704......
  • 三相异步电机直接转矩DTC控制 Matlab/Simulink仿真模型(成品) 传统
    三相异步电机直接转矩DTC控制Matlab/Simulink仿真模型(成品)传统策略DTC1.转速环采用PI控制2.转矩环和磁链环采用滞环控制3.含扇区判断、磁链观测、转矩控制、开关状态选择等ID:64100674198029914......
  • Unity 热更新学习笔记二:异步加载
    在学习异步加载前应该学习一下Untiy中如何进行性能分析为什么热更新要学习性能分析?在热更新的过程其实也就是一种资源加载的过程,而涉及到资源加载就不得不提性能分析。因为资源的加载通常是异步加载的,如果把资源都统合在一起加载游戏界面就会卡住,这是我们不希望发生的事情。Unt......
  • 20230515学习笔记——js中的同步任务与异步任务,宏任务与微任务
    2023-05-15(1)js中的同步任务与异步任务①同步任务是指:不耗时的任务,就是执行很快,②异步任务是指:耗时的任务,它里面有一个机制是EventLoop(事件循环),即值耗时任务会被js分配到宿主环境中进行执行,执行后的结果放到一个“消息队列”中,当js将同步任务执行完毕后,才会调用异步环境。在消......