最近在做异步编程相关工作,将大批量的数据分批次放入异步线程池执行,当每个异步都执行完成之后将结果合并再更新数据库。
实例代码如下:
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的控制台是不会报错提示的。所以浪费了很长时间找原因。切记~~~~