我有四个服务。One will give hotels which is matching to the query.One will give City which is matching to the query.One will give Airports which is matching to the query.One will give Metro stations which is matching to the query.对于每个 HTTP 请求,我将点击这四个服务,并合并来自四个服务的响应并返回。所以我的示例代码就像for(EntityGroups entityGroups: EntityGroups.values()){ Callable<Response> callable = new XCallable(entityTypetoFetch, searchQuery); Future<List<Entity>> listFuture = executor.submit(callable); entityTypeAndFutureMap.put(entityTypetoFetch, listFuture); }在此之后,我在 for 循环中得到所有响应trainStationList = entityTypeAndFutureMap.get(EntityGroups.TRAIN_STATION).get(); landmarkEntities = entityTypeAndFutureMap.get(EntityGroups.LANDMARK_GROUP).get(); cityEntities = entityTypeAndFutureMap.get(EntityGroups.CITY_GROUP).get(); hotelEntities = entityTypeAndFutureMap.get(EntityGroups.HOTEL_GROUP).get();因为我希望所有列表合并并做出最终响应。我正在打一个阻塞电话。我只想合并这些列表并返回。如果我在这里使用 completablefuture,会有帮助吗?到目前为止,随着 TPS 的增加,我的 CPU 使用率非常高。增加机器是有帮助的,但还有什么优化的方法来解决这个问题吗?
1 回答
慕侠2389804
TA贡献1719条经验 获得超6个赞
ACompletableFuture
有一些常规Future
函数没有的功能特性,例如链接执行的能力,thenApply
或者thenAccept
采用在结果可用后处理结果的函数的能力。您还可以通过调用complete()
.CompletableFuture
所以在你的情况下,这取决于你想对结果做什么。如果您在进一步的程序流程中需要结果,您必须像使用get()
方法一样等待它。由于 Futures 将在创建后立即执行,它们将在 Worker-Thread 上并行运行,并且按顺序等待它们并不意味着它们将按顺序运行。
但是,如果您不需要将结果进行进一步处理(例如,您只想将结果插入数据库中)CompletableFuture
,那么您可以提供一个函数来获取结果并对其进行处理。例如。像这样completableFuture.thenAccept(result -> DB::storeInDB);
这样你就不必等待结果了get()
。
添加回答
举报
0/150
提交
取消