2017-04-05 44 views
5

我通过流式传输对象列表来调用异步客户端方法。该方法返回Future。在期货列表上流式传输的最有效方式

对呼叫后返回的期货列表进行迭代的最佳方式是什么(以便处理那些首先出现的未来)?

注意:异步客户端只返回Future not CompletableFuture。

以下是代码:

List<Future<Object>> listOfFuture = objectsToProcess.parallelStream() 
    .map((object) -> { 
     /* calling an async client returning a Future<Object> */ }) 
    .collect(Collectors.toList()); 
+0

你考虑使用CompletionService而不是结果到一个数组映射? http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CompletionService.html –

+0

也许试试[CompletionService](http://docs.oracle.com/javase/7/docs/ API/JAVA/UTIL /并发/ CompletionService.html)?这里是[解释](http://stackoverflow.com/a/19348417/6785649)。 –

+3

如果您无法控制生成“Future”的代码/将作业提交给“Executor”,那么'CompletionService'就没有用处了。 – Holger

回答

3

具有List<Future<Object>>这个名单,我将它提交给一个自定义池,而不是使用默认流的并行处理。

这是因为流api使用公共池进行并行处理,您将在这些未来(如果需要大量时间处理)调用get - 您将阻止在应用程序中使用并行操作的所有其他流操作,直到这个完成了。

这有点像这样:

forJoinPool.submit(() -> list.stream().parallel().map(future -> future.get()).collect(Collectors.toList())).get(); 

我会去像一个自定义的池显示here