何时使用 CompletableFuture 的非异步方法?

When to use non-async methods of CompletableFuture?

我(大部分)理解CompletableFuture的三种执行方式:

我的问题是:什么时候应该支持使用非异步方法?

如果您有一个代码块调用其他同样 return CompletableFuture 的方法,会发生什么情况?这在表面上看起来可能很便宜,但如果这些方法也使用非异步调用会怎样?这不是加起来会变得昂贵的一个长的非异步块吗?

是否应该将非异步执行的使用限制在不调用其他方法的简短、定义明确的代码块中?

When should one favor the use of non-async methods?

延续的决定与前面的任务本身没有什么不同。您什么时候选择使操作异步(例如,使用 CompletableFuture)与编写纯同步代码?同样的指南也适用于此。

如果您只是简单地使用结果或使用完成信号来启动 另一个 异步操作,那么这本身就是一个廉价操作,没有理由不使用同步完成方法。

另一方面,如果您将多个 long-running 操作链接在一起,每个操作本身都是异步操作,那么请使用异步完成方法。

如果您介于两者之间,请相信您的直觉,或者直接使用异步完成方法。如果您没有协调数以千计的任务,那么您就不会增加大量开销。

Should one restrict the use of non-async execution to short, well-defined code-blocks that do not invoke other methods?

我会将它们用于不属于 long-running 的操作。您不需要将它们的使用限制在 普通 简短的回调中。但我认为你的想法是正确的。

如果您正在使用 CompletableFuture,那么您已经确定代码库中至少 一些 操作需要异步执行,但大概不需要 all 操作是异步的。您如何决定哪些应该异步,哪些不应该?如果您将相同的分析应用于延续,我想您会没事的。

What happens if you have a code block that invokes other methods that also return CompletableFutures? This might look cheap on the surface, but what happens if those methods also use non-async invocation? Doesn't this add up to one long non-async block that could get expensive?

返回 CompletableFuture 通常表示基础操作被安排为异步发生,因此这应该不是问题。在大多数情况下,我希望流程看起来像这样:

  1. 您同步调用异步方法 returning a CompletableFuture。它安排一些异步操作以最终提供结果。您的呼叫几乎立即 return,没有阻塞。
  2. 完成后,可以调用一个或多个延续。其中一些可能会调用额外的异步操作。这些将调用将安排额外异步操作的方法,但和以前一样,它们几乎立即 return。
  3. 转到 (2),或完成。