java - CompletableFuture 无需阻塞即可获取结果

标签 java concurrency completable-future

private static boolean validateSMTP(final ArrayList mxList, String address) throws ExecutionException, InterruptedException {
  ExecutorService pool = Executors.newFixedThreadPool(mxList.size());
  List<CompletableFuture<Boolean>> allVerifiers = new ArrayList<>();
    for (int mx = 0; mx < mxList.size(); mx++) {
        CompletableFuture<Boolean> verifier = createAsyncVerifier((String) mxList.get(mx), address, pool);
        verifier.thenApply(isvalid -> isvalid);
        verifier.get();
    }
  return false;
}

在上面的代码中,我想创建mxList.size() CompletableFuture,并执行每个。如果其中任何一个的结果是 true,我想打破循环,当我使用 get() 方法时,它会阻塞,我浪费了并发的好处,任何想法关于如何做到这一点?

最佳答案

这是一个提交所有任务然后获取结果的实现,返回第一个 true 结果:

private static boolean validateSMTP(final ArrayList<String> mxList, String address)
        throws ExecutionException, InterruptedException {

    ExecutorService pool = Executors.newFixedThreadPool(mxList.size());

    return mxList.stream()
            .map(mx -> createAsyncVerifier(mx, address, pool))
            .collect(Collectors.toList())
            .stream()
            .map(CompletableFuture<Boolean>::join)
            .filter(b -> b)
            .findFirst()
            .orElse(Boolean.FALSE);
}

.collect(Collectors.toList()) 确保提交所有任务。在第二个流中,调用 join,但这不会导致不必要的等待,因为所有任务都已提交。

findFirst 将在第一个元素通过过滤器后立即返回。

关于java - CompletableFuture 无需阻塞即可获取结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53214504/

相关文章:

java - 将一个 MenuItem 添加到多个菜单

java - 选择文件路径未在android studio中转换为文件

java - 不使用 Lines2D 的橡皮筋

Java future : How to unblock Main thread while executing Aysnc call

java - 如何使用 Java 流式传输 mp3 文件?

Haskell:原子 IO 包装器/惰性?

c# - 如何跨越多个 TPL 数据流 block 的 MaxDegreeOfParallelism?

go - Go 中令人尴尬的并行任务的惯用解决方案是什么?

Spring @Async 与 CompletableFuture

java - 如何在 java 中组合多个类型列表(对我来说)或其他类型的 CompletionStage 响应