'CompletionStage'和'CompletableFuture'有什么区别?

时间:2017-11-30 10:26:25

标签: java concurrency completable-future

我已经在每一个中看到了一个例子,但是我需要确切地知道深层有什么区别,因为有时我认为我可以使用它们来获得相同的结果,所以我想知道这样我就可以选择正确的?

使用它们的好处是什么?

就像这个例子一样,两者都有效:

public CompletionStage<Result> getNextQueryUUID() {
    return CompletableFuture.supplyAsync(() -> {
        String nextId = dbRequestService.getNextRequestQueryUUID();
        return ok(nextId);
    }, executor);
}


public CompletableFuture<Result> getNextQueryUUID() {
    return CompletableFuture.supplyAsync(() -> {
        String nextId = dbRequestService.getNextRequestQueryUUID();
        return ok(nextId);
    }, executor);
}
  

此示例在Play framework中运行。

3 个答案:

答案 0 :(得分:11)

CompletionStage<T>CompletabeFuture<T>是此接口的唯一实现类的接口。通过查看CompletionStage<T>的java文档,您会注意到CompletionStage接口提供了获取一个CompletionStage并将其转换为另一个CompletionStage的方法。但是,CompletionStages返回的这些对象实际上是它们自己的CompletabeFuture<T>个对象。

因此使用CompletabeFuture<T>与使用CompletionStage<T>是一回事,但后者可以用作未来可能的新类的基本接口,也可以作为许多目标类型降序类型就像我们倾向于List<Integer> integerList = new ArrayList<>();而不是ArrayList<Integer> integerList = new ArrayList<>();

一样

您可以阅读帖子introduction to CompletionStage and CompletableFuture了解更多详情。

答案 1 :(得分:10)

CompletableFutureCompletionStage。但是,顾名思义,它是

  • 可完成:可以使用complete或完成 completeExceptionally
  • a Future:您可以使用get方法等来获得结果。

恕我直言,在大多数API中,如您的示例中所示,您应该使用CompletionStage,因为

  • 实施通常提供完成阶段的机制。您不需要/想要向调用者公开complete等方法。
  • 调用者应以异步方式使用返回的值,而不是使用get提供的Future之类的阻止调用。

答案 2 :(得分:1)

一个是接口,另一个是类。通常你返回接口而不是实现,但我怀疑这是这种情况。返回CompletableFuture对我来说更有意义。

除非你正在使用该界面的其他一些实现,比如Spring DelegatingCompletableFuture,但是从你的例子中你不是。