我有一个字符串列表,对于每个字符串,我需要打开一个新线程并将所有信息收集到CompletableFuture中。
这是我的迭代:
for (String result: results) {
candidateInfos.add(getCandidatesInfo(result));
}
我第一次尝试执行线程,我会很感激一些帮助。
答案 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