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

CompletableFuture,然后Compose方法

丁良骏
2023-03-14

我对函数的契约有一些误解

返回一个新的CompletionStage,当此阶段正常完成时,将此阶段作为提供函数的参数执行。

函数似乎接受这个完成阶段的结果,而不是完成阶段本身。那么这是什么意思呢?

那么由返回的CompletableFuture表示的任务呢?

Runnable r;
ExecutorService es;
Function<Void, CompletableFuture<Void>>f;
//...
CompletableFuture.runAsync(r, es)
.thenCompose(f);

这是否意味着,由返回的CompletableFuture表示的任务将在与可运行r相同的线程池中执行?

共有1个答案

王翰墨
2023-03-14

这似乎是JavaDoc中的一个错误。其他方法,例如thenApply使用以下公式:

返回一个新的CompletionStage,当此阶段正常完成时,该阶段将以此阶段的结果作为提供的函数的参数执行。[…]

(重点是我自己)

此外,在Java9中,现在的表述是:

返回一个新的CompletionStage,该阶段使用与给定函数返回的CompletionStage相同的值完成。

当该阶段正常完成时,调用给定函数,并将该阶段的结果作为参数,返回另一个CompletionStage。当该阶段正常完成时,此方法返回的CompletionStage将使用相同的值完成。[…]

至于哪个线程/线程池将执行该函数,这实际上取决于实现。

对于CompletableFuture,这在文档顶部显示:

为非异步方法的依赖完成提供的操作可以由完成当前CompletableFuture的线程或完成方法的任何其他调用者执行。

在实践中,似乎有两种可能的情况:

  1. 如果此阶段已经完成,则该函数将立即应用于调用thencose()的线程

请注意,在可完成的未来中没有“任务”。返回的CompletableFuture所做的唯一“任务”是将传递函数返回的结果与自身绑定。您负责执行将完成函数返回的CompletableFuture的任务。

 类似资料:
  • 我被CompletableFuture异常处理卡住了。 我的逻辑是发送电子邮件并保存此操作的状态。如果发送电子邮件抛出异常,我需要用异常消息保存状态。 处理器类目前有此代码。它工作正常,但对我来说并不优雅。我们如何摆脱用于在阶段之间共享状态的错误本地字段? 看起来句柄方法应该会有所帮助,但它返回可完成未来的可完成未来

  • 关于方法何时应该返回CompletableFuture的一般准则是什么?假设有两个类A和B,其中类B有一个执行大量IO的方法performTask(),类A调用performTask()方法在Java可以使用以下方法编写多线程代码: < li >让方法的调用方决定是否使用ThreadPool异步执行方法。在这种情况下,A将异步调用performTask()方法,这样类B就不需要使其方法异步。 <

  • 根据angular 4项目中的状态条件,我必须将4个可用类(黄色、绿色、红色和白色)中的一个应用到我的div。 上述陈述中只有一个条件可以为真。 如何实现这一点(如果其他如果其他...Angular4) 中的其他语句?

  • 我正在尝试实现一个通用的REST客户端,如下所示。我有自己的模型将HTTP响应表示为response T。这里T是服务调用的返回类型,它可能只是T或Ts列表。下面的代码不编译,我需要帮助。 最终调用下面的方法,

  • 在Java 8中引入了CompletableFuture类来表示Future,可以通过设置其值和状态明确来完成。 它可以用作java.util.concurrent.CompletionStage。 它支持在未来完成时触发的依赖功能和操作。 在java 9中,CompletableFuture API得到了进一步的增强。 以下是对API进行的相关更改。 支持延迟和超时。 Improved supp

  • 问题内容: 我刚刚开始探索Java 8的一些并发特性。让我有些困惑的是这两个静态方法: 有谁知道为什么选择使用界面供应商?使用Callable是否更自然,这类似于Runnable返回值?那是因为供应商没有抛出无法处理的异常吗? 问题答案: 简短答案 不,用代替in 是不自然的。该论点几乎完全是关于语义的,因此,如果您此后仍不确信,那就可以了。 长答案 的和功能接口/ SAM类型在功能几乎等同(原谅