在期货清单上流式传输的最有效方式
Most efficient way to stream on list of Futures
我通过流式传输对象列表来调用异步客户端方法。方法 returns 未来。
迭代调用后返回的 Future 列表的最佳方法是什么(以便处理先出现的 Future)?
注意:仅异步客户端 returns Future 而不是 CompletableFuture。
代码如下:
List<Future<Object>> listOfFuture = objectsToProcess.parallelStream()
.map((object) -> {
/* calling an async client returning a Future<Object> */ })
.collect(Collectors.toList());
有了这个 List<Future<Object>>
的列表,我会将其提交到自定义池,而不是使用默认的流并行处理。
这是因为流 api 使用公共池进行并行处理,您将对这些 Futures 调用 get
(如果处理需要大量时间)- 您将阻塞所有其他流在您的应用程序中使用并行操作的操作,直到完成此操作。
这有点像这样:
forJoinPool.submit( () -> list.stream().parallel().map(future -> future.get()).collect(Collectors.toList())).get();
我会使用如图所示的自定义池 here
我通过流式传输对象列表来调用异步客户端方法。方法 returns 未来。
迭代调用后返回的 Future 列表的最佳方法是什么(以便处理先出现的 Future)?
注意:仅异步客户端 returns Future 而不是 CompletableFuture。
代码如下:
List<Future<Object>> listOfFuture = objectsToProcess.parallelStream()
.map((object) -> {
/* calling an async client returning a Future<Object> */ })
.collect(Collectors.toList());
有了这个 List<Future<Object>>
的列表,我会将其提交到自定义池,而不是使用默认的流并行处理。
这是因为流 api 使用公共池进行并行处理,您将对这些 Futures 调用 get
(如果处理需要大量时间)- 您将阻塞所有其他流在您的应用程序中使用并行操作的操作,直到完成此操作。
这有点像这样:
forJoinPool.submit( () -> list.stream().parallel().map(future -> future.get()).collect(Collectors.toList())).get();
我会使用如图所示的自定义池 here