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

Java 8使用CompletableFuture::join维护流顺序

耿锦
2023-03-14

我有一个异步执行的查询的输入流。我想确保当我使用可完成未来::join时,这些要求的结果将按照输入查询流的顺序收集。

这是我的代码的样子:

queries.stream()
     .map(query -> CompletableFuture.supplyAsync(() -> {
                    try {
                        return SQLQueryEngine.execute(query);
                    } catch (InternalErrorException e) {
                        throw new RuntimeException(e);
                    }
     }))
     .map(CompletableFuture::join)
     .collect(Collectors.toList());

SQLQueryEngine。执行(查询);返回列表


共有1个答案

钱焕
2023-03-14

您可能指的是.持平地图,是的,它将保留顺序。

考虑显式地将Executor传递给supplyAsync,以避免在 forkjoinpool.commonpool()< ode=""> 中调度IO绑定的sql查询。

正如@Ruben指出的那样,在提交当前线程之后和提交下一个查询之前,您将立即加入当前线程中的每个任务,这可能是一个错误。您应该先提交所有查询,然后才能开始加入。

你可以这样做(静态导入 toList):

queries.stream()
    .map(query -> CompletableFuture.supplyAsync(...))
    .collect(toList())
    .stream()
    .map(CompletableFuture::join)
    .collect(toList());
 类似资料:
  • 我正在使用apache flink构建一个相当复杂的数据流网络。其思想是,用Flink实现一个规则引擎。 作为应用程序的基本描述,它应该是这样工作的: 数据由kafka消费者源接收,并用多个数据流处理,直到最终发送到kafka生产者接收器。传入的数据包含具有逻辑键(“object-id”)的对象,传入的消息可能引用相同的object-id。对于每个给定的object-id,必须在整个应用程序中保留

  • 假设我有一个工作流,在

  • 下面是我的代码: 这两种方法我都试过了,但我看不出结果有什么不同。

  • 本文向大家介绍Java8 CompletableFuture详解,包括了Java8 CompletableFuture详解的使用技巧和注意事项,需要的朋友参考一下 Java 8来了,是时候学一下新的东西了。Java 7和Java 6只不过是稍作修改的版本,而Java 8将会发生重大的改进。或许是Java 8太大了吧?今天我会给你彻底地解释JDK 8中的新的抽象 – CompletableFutur

  • 问题内容: 我正在使用JSONObject来删除JSON字符串中不需要的certin属性: 它可以正常工作,但是问题是JSONObject是“名称/值对的无序集合”,我想保持String在通过JSONObject操作之前的原始顺序。 任何想法如何做到这一点? 问题答案: 你不能 这就是为什么我们称其 为名称/值对的无序集合 。 我不确定为什么需要这样做。但是,如果要订购,则必须使用json数组。

  • 我有一个从各种文件加载时间序列数据的应用程序。应用程序为每个文件打开一个线程以并行加载数据。文件中的记录是有序的,但我需要向应用程序的其余部分提供一个提要,以维护事件的整体顺序。 这是否可以使用像多个生产者一样的破坏者——一种消费者类型的设计来实现,以维持事件的顺序? 我目前正在使用阻塞集合和排序列表对每个阻塞集合的头部进行排序,但这会消耗大量内存,我想看看是否有其他人使用不同的体系结构实现了类似