首页 > 编程语言 >关于CompletableFuture异步编程使用allof后不继续执行问题

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

时间:2023-02-07 12:00:24浏览次数:73  
标签:异步 nThreads allof List CompletableFuture quotaSettleList

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

实例代码如下:

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


标签:异步,nThreads,allof,List,CompletableFuture,quotaSettleList
From: https://www.cnblogs.com/csnjava/p/17097909.html

相关文章

  • Python 异步: 创建和运行异步任务(7)
    您可以从asyncio程序中的协程创建任务对象。任务提供独立调度和运行的协程的句柄,并允许查询、取消任务,以及稍后检索结果和异常。异步事件循环管理任务。因此,所有协程都成......
  • Android AsyncTask实现异步任务的执行
    Android的AsyncTask比Handler更轻量级一些,适用于简单的异步处理。首先明确Android之所以有Handler和AsyncTask,都是为了不阻塞主线程(UI线程),且UI的更新......
  • 面试官:实现异步的20种方式,你知道几个?
    文章很长,而且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录博客园版为您奉上珍贵的学习资源:免费赠送:《尼恩Java面试宝典》持续更新+史上最全+面试必备2000页+面......
  • 异步编程(协程asyncio)
    协程1.异步非阻塞,asyncio2.异步框架:提升性能tomadofastapidjango3.xasgiaiohttp协程是什么协程是不是计算机提供出来的,程序员自己创建的。​协程(corout......
  • Spring异步Async和事务Transactional注解
    Spring开发中我们我们常常用到@Transaction和@Async,但这2个注解加在一起很多的开发者不敢用,担心事务不生效。下面我们就仔细讲解一下这2个注解同时运用,文章用3个场景讲述它......
  • 帮你快速理解同步 ,异步,并发/并行,串行
    同步:多个任务情况下,一个任务A执行结束,才可以执行另一个任务B。只存在一个线程。异步:多个任务情况下,一个任务A正在执行,同时可以执行另一个任务B。任务B不用等待任务A结束才......
  • 多线程之CompletableFuture
    目录1.Future回顾代码示例:2.CompletableFuture实现上面示例CompletableFuture创建方式常用的4种创建方式:CompletableFuture源码中有四个静态方法用来执行异步任务区别结果......
  • 探秘多线程-闭锁、栅栏与异步编排
    无论是项目开发还是开源代码阅读,多线程都是不可或缺的一个重要知识点,基于这个考量,于是总结出本篇文章,讨论闭锁(CountDownLatch)、栅栏(CyclicBarrier)与异步编排(CompletableF......
  • 通过一个示例形象地理解C# async await 非并行异步、并行异步、并行异步的并发量控制
    前言接上一篇通过一个示例形象地理解C#asyncawait异步我在.NET与大数据中吐槽前同事在双层循环体中(肯定是单线程了)频繁请求es,导致接口的总耗时很长。这不能怪前同......
  • Python 异步: 什么是事件循环 ?(6)
    asyncio程序的核心是事件循环。在本节中,我们将花点时间看一下asyncio事件循环。1.什么是Asyncio事件循环事件循环是用于在单个线程中执行协程的环境。事件循环是异......