繁体   English   中英

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

[英]When to use non-async methods of CompletableFuture?

我(大多数)理解CompletableFuture的三种执行方法:

  • 非异步( 同步执行
  • default async(使用默认执行程序异步)
  • 自定义异步(使用自定义执行程序进行异步)

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

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

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

什么时候应该支持使用非异步方法?

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

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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM