Java仅在ForkJoinPool提交后才执行代码

标签 java asynchronous java-8 parallel-processing forkjoinpool

我有 1 个使用 ForkJoinPool 的并行处理代码:

ForkJoinPool customThreadPool = new ForkJoinPool(4);
customThreadPool.submit(() -> {
    list.parallelStream().forEach(this::process);
});

我通过一些 Controller 调用这个。此代码异步运行,因此 Controller 响应将立即发生,并且异步过程将在后台发生。

现在我想在所有过程完成后触发另一个处理。 有没有什么方式或方法只有在完成ForkJoinPool提交后才执行。

我尝试了 submit.isDonesubmit.isCompletedNormally 但这会立即运行,而不是在提交完成后运行。

最佳答案

submit 方法返回一个 Future,您需要等待它。所以你对它调用get。我认为这样的代码适合您的情况

import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;

class Scratch {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        List<String> list = List.of("a", "b", "c");
        ForkJoinPool customThreadPool = new ForkJoinPool(4);
        customThreadPool.submit(() -> {
            list.parallelStream().forEach(Scratch::process);
        }).get();
        customThreadPool.submit(() -> System.out.println("done"));

    }

    private static void process(String s) {
        System.out.println(s);
    }
}

打印

b
a
c
done

请注意,a、b、c 的顺序不是确定性的,但完成将始终是最后

关于Java仅在ForkJoinPool提交后才执行代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69358234/

相关文章:

java - Neo4j 在 Java 中使用 cypher 进行部分转储

java - Tomcat垃圾回收不彻底

java - 从 Firestore 下载数据较晚

java - 在查询数据库时将列表转换为逗号分隔的字符串以传递 SQL 的最佳方法是什么?

java - 与collect(supplier,accumulator,combiner)并行使用java流没有给出预期的结果

java - hadoop 2在事务中是原子的吗

apache - 使用 Apache 和 HAProxy 诊断 HTTP 500 错误

asynchronous - 为什么 Future.timeout 在 dart 中不起作用?

java - 提高数据库访问性能

java - 使用 java 流解析列表