关于CompletableFuture异步编程使用allof后不继续执行问题

      最近在做异步编程相关工作,将大批量的数据分批次放入异步线程池执行,当每个异步都执行完成之后将结果合并再更新数据库。

        实例代码如下:

int nThreads = 5;
            int unit = quotaSettleList.size() % nThreads > 0 ? quotaSettleList.size() / nThreads : quotaSettleList.size() / nThreads + 1;
            List<List<TQuotaSettle>> partition = Lists.partition(quotaSettleList, unit);
            List<TQuotaSettle> list = new ArrayList<>();
            List<CompletableFuture> futures = new ArrayList<>();
            for (List<TQuotaSettle> part : partition) {
                futures.add(CompletableFuture.supplyAsync(() -> getUpdateTo(part), executorService).thenAccept((s) -> list.addAll(s)));
            }
            CompletableFuture.allOf(futures.stream().toArray(CompletableFuture[]::new)).thenRun(() -> tQuotaDao.updateSettlePrice(list));

       但是当我在接收最终结果的时候thenRun()后面的方法不执行,找了好长时间,并更换了多种写法,终于找到了原因。

        使用allof的时候,合并的子异步线程如果代码报错的话,就不会执行下去了,说明白点就是我的add()里面的getUpdateTo()方法报错了,导致allof().thenRun()没有继续执行。但是ieda的控制台是不会报错提示的。所以浪费了很长时间找原因。切记~~~~
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值