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

时间:2018-04-04 11:00:15

标签: java completable-future

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

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

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

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

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

1 个答案:

答案 0 :(得分:2)

  

何时应该支持使用非异步方法?

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

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

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

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

  

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

我会将它们用于不长时间运行的操作。您不需要将其使用限制为简单短而简单的回调。但我认为你有正确的想法。

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

  

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

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

  1. 您同步调用返回CompletableFuture的异步方法。它会调度一些异步操作以最终提供结果。您的电话几乎立即返回,没有阻止。
  2. 完成后,可以调用一个或多个延续。其中一些可能会调用其他异步操作。那些会调用方法来安排额外的异步操作,但和以前一样,它们几乎立即返回。
  3. 转到(2)或完成。