当前位置: 首页 > 知识库问答 >
问题:

如何异步运行组合完全期货

耿运浩
2023-03-14

我希望通过调用不同的服务来加载应用程序启动时的数据,这些服务返回不同对象类型的列表。每个服务调用DAO类来读取一些数据。因此,我创建了个人CompletableFuture如:

CompletableFuture<List<DTO1> future1 = CompletableFuture.supplyAsync(() -> service1.callMethod1());
CompletableFuture<List<DTO2> future2 = CompletableFuture.supplyAsync(() -> service2.callMethod2());
CompletableFuture<List<DTO3> future3 = CompletableFuture.supplyAsync(() -> service3.callMethod3());

并将它们结合起来,如:

CompletableFuture<Void> combinedFuture = CompletableFuture.allOf(future1, future2, future3);

如果我这样做:

combinedFuture.thenRunAsync(()->future1.join(), future2.join(), future3.join())

然后我得到了编译时错误。我不熟悉Java 8的并发特性,例如CompletableFuture,我认为调用thenRunAsync将在不同的线程中运行每个future1、future2、future3。调用thenRunAsync是否正确?如果是,那么如何删除编译时错误?

但是如果我做了这样的事情:

Stream.of(future1, future2, future3)
        .map(CompletableFuture::join)
        .collect(Collectors.toList());

它正在返回列表

Stream.of(future1, future2, future3)
        .foreach(CompletableFuture::join);

它会在不同的线程中运行每个future1、future2、future3?如何在3个不同的线程中运行future1、future2、future3?有没有正确的方法异步运行这三个数据库调用?


共有1个答案

上官华池
2023-03-14
CompletableFuture<List<DTO1> future1 = CompletableFuture.supplyAsync(() -> service1.callMethod1());
CompletableFuture<List<DTO2> future2 = CompletableFuture.supplyAsync(() -> service2.callMethod2());
CompletableFuture<List<DTO3> future3 = CompletableFuture.supplyAsync(() -> service3.callMethod3());

这段代码已经指示所有三个未来在不同的线程上运行(假设公共池中至少有3个线程)。对其中一个调用join()只会指示调用线程在该任务完成时阻塞,并且不会改变这3个调用并行进行的事实。所有编译的解决方案都是合理的。

 类似资料:
  • 问题内容: 如何不等待就异步运行PHP代码?我有一个长期运行(几乎无限),应该在服务器启动时运行,并且应该异步处理而无需等待。 我猜可能的选择是: 在网页中运行代码并保持打开状态以执行该任务 从某些在后台处理的命令行实用程序(我不确定如何)调用脚本。 我在本地服务器上运行PHP脚本,该脚本将在发生某些事件(例如生日提醒)时发送电子邮件。 请提出在不使用浏览器打开页面的情况下如何实现此目的。 问题答

  • 我正在试验Python 3.4的asyncio模块。由于没有使用asyncio的MongoDB生产就绪包,我编写了一个小包装类,在执行器中执行所有mongo查询。这是包装: 我想异步执行插入,这意味着执行它们的协程不想等待执行完成。asyncio手册声明,所以我构造了这个测试脚本: 当我运行脚本时,我得到以下结果: 应该有一行指示mongo查询已完成。当我从这个协程而不是使用异步IO运行它时,我可

  • 我必须符合以下标准: null 这是一大堆问题,我知道。但基本上是如何运行一个完全符合FIPS的Spring Boot应用程序?

  • 问题内容: 许多Cocoa和CocoaTouch方法都将完成回调实现为Objective- C中的块,而实现为Swift中的Closures。但是,在Playground中尝试这些操作时,永远不会调用完成操作。例如: 我可以在Playground时间轴中看到控制台输出,但是在我的完成块中从未调用过… 问题答案: true`。如果设置了此属性,则在您的顶级游乐场源完成时,我们将继续旋转主运行循环,而

  • 我正在编写一个WinForms应用程序,它将数据传输到USB HID类设备。我的应用程序使用了优秀的通用HID库V6.0,可以在这里找到。简单来说,当我需要向设备写入数据时,这是被调用的代码: 当我的代码退出while循环时,我需要从设备中读取一些数据。但是,设备无法立即响应,因此我需要等待此呼叫返回后再继续。由于当前存在,RequestToGetInputReport()声明如下: GetInp

  • 问题内容: 总的来说,我对Swift和Xcode还是比较陌生,并且发现很多困难要设法解决。 我正在开发一个利用后端服务器的应用程序。为了不阻塞主线程,每当应用程序从服务器下载任何内容时,它都会异步地在其他线程上完成。但是,其余代码将继续在主线程上执行,并且当应该从服务器下载的数据尚未下载时,它将崩溃。我想知道如何在异步函数完成后调用函数来运行,这对于单独文件中的函数必须完成。 我读过闭包可能对此有