java 多线程异步处理任务集中统一处理结果

背景:开发中遇到主流程中需要同时处理多个流程时,并且对耗时和性能有高要求
推荐:CompletableFuture
用法:多任务时,支持同步异步执行,并行,串行,顺序执行,有无结果返回,结果统一处理,单独处理结果等
,具体方法百度CompletableFuture语法
案例:👇👇👇👇👇
// 这是一个利用CompletableFuture分组in查询数据库的操作,其他业务场景用法原理一样
// 数据库in操作 in的数值很多 避免数据库压力太大 提高查询性能和效率

// 1.需要in的数据集
List<Integer> mergeAlarmIds = mergeAlarmProcessList.stream().map(MergeAlarmProcess::getMergeAlarmId).collect(Collectors.toList());
            List<MergeAlarm> mergeAlarmList = new ArrayList<>();
            // 50个为一组
            List<List<Integer>> departmentGroup = Lists.partition(mergeAlarmIds, 50);
            // 分组执行 避免in参数过多
            List<CompletableFuture<List<MergeAlarm>>> futures = new ArrayList<>();
            for (List<Integer> integers : departmentGroup) {
            	// supplyAsync异步执行 结果添加到futures 可以指定线程池
                futures.add(CompletableFuture.supplyAsync(() ->
                        // 查询  自己的查询逻辑
                        mergeAlarmService.getMergeAlarmListByCondition(
                                this.mergeAlarmService.condition()
                                        .in(MergeAlarm.ID,integers)                                      
                ));
            }
            CompletableFuture[] collect = futures.toArray(new CompletableFuture[futures.size()]);
            // 想要结果集中处理必须加join() 多线程的结果处理不完 会卡在这里 直到全部执行结束
            CompletableFuture.allOf(collect).join();
            // 所有结果集中处理 添加到集合中
            for (CompletableFuture future : collect) {
                try {
                    mergeAlarmList.addAll((List<MergeAlarm>) future.get());
                } catch (Exception e) {
                    log.error("查询数据失败:{}", e.getMessage(), e);
                }
            }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值