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

Ebr*_*ee' 20 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);
}
Run Code Online (Sandbox Code Playgroud)

这个例子运行于Play framework.

Ous*_* D. 12

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

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

您可以阅读CompletionStage和CompletableFuture的帖子介绍,了解更多详情.


Xia*_*iao 11

A CompletableFuture是一个CompletionStage.但是,顾名思义,它就是

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

恕我直言,在大多数API中,就像在你的例子中一样,你应该使用CompletionStage,因为

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