关于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的控制台是不会报错提示的。所以浪费了很长时间找原因。切记~~~~


posted on 2023-02-07 11:54  云淡风轻博客  阅读(701)  评论(0编辑  收藏  举报