gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:24:03 25 4
gpt4 key购买 nike

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

  • 非异步(synchronous execution)
  • 默认异步(异步使用默认执行器)
  • 自定义异步(使用自定义执行程序的异步)

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

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

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

最佳答案

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

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

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

另一方面,如果您将多个长时间运行的操作链接在一起,并且每个操作本身都是异步操作,那么请使用异步完成方法。

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

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

我会将它们用于非长时间运行的操作。您不需要将它们的使用限制在普通 简短的回调中。但我认为您的想法是正确的。

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

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. 您同步调用返回 CompletableFuture 的异步方法。它安排一些异步操作以最终提供结果。您的调用几乎立即返回,没有阻塞。
  2. 完成后,可以调用一个或多个延续。其中一些可能会调用额外的异步操作。这些将调用将安排额外异步操作的方法,但和以前一样,它们几乎立即返回。
  3. 转到 (2),或完成。

关于java - 何时使用 CompletableFuture 的非异步方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49649298/

25 4 0