【问题标题】:What is the correct way to create an already-completed CompletableFuture<Void>创建已经完成的 CompletableFuture<Void> 的正确方法是什么
【发布时间】:2018-03-20 09:11:18
【问题描述】:

我在 java 8 中使用 Completable futures,我想编写一个方法,基于接收到的参数,并行运行多个具有副作用的任务,然后返回它们的“组合”未来(使用CompletableFuture.allOf()),或者什么都不做并返回一个已经完成的未来。

但是,allOf 返回 CompletableFuture&lt;Void&gt;:

public static CompletableFuture<Void> allOf(CompletableFuture<?>... cfs)

创建一个已经完成的未来的唯一方法是使用completedFuture(),它需要一个值:

public static <U> CompletableFuture<U> completedFuture(U value)

返回一个新的 CompletableFuture,它已经用给定的值完成。

而Void 是不可实例化的,所以我需要另一种方法来创建CompletableFuture&lt;Void&gt; 类型的已经完成的未来。

最好的方法是什么?

【问题讨论】:

  • 你就不能CompletableFuture.&lt;Void&gt;(null)吗?

标签: java concurrency java-8 completable-future


【解决方案1】:

由于Void不能被实例化,你只能用null结果完成CompletableFuture&lt;Void&gt;,这正是你在allOf()返回的future上调用join()时也会得到的结果已成功完成。

所以你可以使用

CompletableFuture<Void> cf = CompletableFuture.completedFuture(null);

获得这样一个已经完成的未来。

但你也可以使用

CompletableFuture<Void> cf = CompletableFuture.allOf();

表示结果不依赖于任何作业。结果将完全相同。

【讨论】:

    【解决方案2】:

    传递一个null 我猜:

    CompletableFuture<Void> done = CompletableFuture.completedFuture(null);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-13
      • 2018-06-02
      • 2012-06-01
      • 1970-01-01
      • 2012-12-28
      • 1970-01-01
      • 1970-01-01
      • 2016-12-12
      相关资源
      最近更新 更多