如何使用CompletableFuture打开并将列表中的所有结果收集到线程中?

时间:2017-07-05 12:17:41

标签: java multithreading asynchronous completable-future

我有一个字符串列表,对于每个字符串,我需要打开一个新线程并将所有信息收集到CompletableFuture中。

这是我的迭代:

for (String result: results) {
    candidateInfos.add(getCandidatesInfo(result));
}

我第一次尝试执行线程,我会很感激一些帮助。

1 个答案:

答案 0 :(得分:1)

您可以为每个方法调用构建Stream,然后可以按如下方式将结果收集到列表中。

Stream.Builder<Supplier<CanditateInfo>> streamBuilder = Stream.builder();

results.forEach(string-> streamBuilder.accept(() -> this.getCandidatesInfo(string)));

List<CanditateInfo> candidateInfos = streamBuilder.build().map(supplier -> CompletableFuture.supplyAsync(supplier, Executors.newFixedThreadPool(
  results.size()))).collect(Collectors.toList()).stream().map(
     CompletableFuture::join).collect(Collectors.toList());

这里我使用了单独的Executor,因为默认情况下,java使用公共的Fork和Join Pool,如果池已经填满,它将阻塞所有其他线程。有关详细信息,请参阅http://fahdshariff.blogspot.in/2016/06/java-8-completablefuture-vs-parallel.html