我(大部分)了解CompletableFuture的三种执行方法:
我的问题是:什么时候应该支持使用非异步方法?
如果您有一个调用其他方法的代码块,该代码块也返回CompletableFuture,会发生什么?表面上看,这可能很便宜,但如果这些方法也使用非异步调用,会发生什么?这难道不是一个很长的非异步块,可能会变得很昂贵吗?
是否应该将非异步执行的使用限制在不调用其他方法的简短、定义良好的代码块中?
什么时候应该支持使用非异步方法?
继续的决定与先前任务本身没有什么不同。您何时选择使操作异步(例如,使用CompletableFuture
)与编写纯同步代码?相同的指导适用于此处。
如果您只是使用结果或使用完成信号启动另一个异步操作,那么这本身就是一个廉价的操作,没有理由不使用同步完成方法。
另一方面,如果您将多个长时间运行的操作链接在一起,这些操作本身都是异步操作,则使用异步完成方法。
如果您介于两者之间,请相信自己的直觉,或者只使用异步完成方法。如果你不协调成千上万的任务,那么你就不会增加很多开销。
是否应该将非异步执行的使用限制在不调用其他方法的简短、定义良好的代码块中?
我会将它们用于非长期运行的操作。您不需要将它们的使用限制在非常短和简单的回调中。但我认为你的想法是对的。
如果您使用的是CompletableFuture
,那么您已经决定代码库中至少有一些操作需要异步执行,但可能并非所有操作都是异步的。您是如何决定哪些应该是异步的,哪些不应该?如果您将相同的分析应用于延续,我认为您会没事的。
如果您有一个调用其他方法的代码块,该代码块也返回CompletableFuture,会发生什么?表面上看,这可能很便宜,但如果这些方法也使用非异步调用,会发生什么?这难道不是一个很长的非异步块,可能会变得很昂贵吗?
返回CompletableFuture通常表示底层操作被安排为异步发生,因此这不应该是一个问题。在大多数情况下,我希望流看起来像这样:
主要内容:1.业务问题,2.CompletableFuture介绍,3.创建异步对象,4.计算完成时回调方法,5.线程串行化与并行化方法,6.多任务组合,7.优化商品详情页1.业务问题 询商品详情页的逻辑非常复杂,数据的获取都需要远程调用,必然需要花费更多的时间。 假如商品详情页的每个查询,需要如下标注的时间才能完成 获取sku的基本信息 1.5s 获取sku的图片信息 0.5s 获取spu的所有销售属性 1s sku价格 1.5s 那么,用户需要4.5s后才能看到商品详情页的内容。很显然是不能
主要内容:1.业务问题,2.CompletableFuture介绍,3.创建异步对象,4.计算完成时回调方法,5.线程串行化与并行化方法,6.多任务组合,7.优化商品详情页1.业务问题 询商品详情页的逻辑非常复杂,数据的获取都需要远程调用,必然需要花费更多的时间。 假如商品详情页的每个查询,需要如下标注的时间才能完成 获取sku的基本信息 1.5s 获取sku的图片信息 0.5s 获取spu的所有销售属性 1s sku价格 1.5s 那么,用户需要4.5s后才能看到商品详情页的内容。很显然是不能
我可能还不够清楚--情况是,我的现有代码不支持异步,我希望使用新的库,如System.net.http和只支持异步方法的AWS SDK。因此,我需要弥补这一差距,并能够拥有可以同步调用的代码,然后可以在其他地方调用异步方法。 我读了很多书,有很多次有人问这个问题,也有人回答这个问题。 从非异步方法调用异步方法
以下是我尝试使用“可完成未来”类实现的用例 我有一个id列表,我想为每个id调用api 我想从api调用中获得响应,并将其保存在列表或映射中,以便进一步处理 我也不想等到得到所有api调用的响应。我想设定一个时间限制,并在那之前获取所有可用的数据 我尝试了以下代码,但它不能正常工作 您能指导我这个用例吗?我需要 1.超时设置为 2。异步数据处理 3.未知的项目数。 我正在使用Java 8。 谢谢。
这个问题是针对Java和< code>CompletableFuture的。 如果我有一个像下面这样的异步方法, 如果步骤#1中的代码抛出,的调用者将在获得它返回的之前获得异常,而如果步骤#2中返回的中的代码抛出,调用者将仅在与返回的交互时获得异常。 这表明的调用方应该编写一些复杂的异常处理代码来处理这两种情况。 下面是另一个异步方法的示例,,该方法调用并返回它返回的字符串长度: 我的问题是: <