我有 1 个使用 ForkJoinPool 的并行处理代码:
ForkJoinPool customThreadPool = new ForkJoinPool(4);
customThreadPool.submit(() -> {
list.parallelStream().forEach(this::process);
});
我通过一些 Controller 调用这个。此代码异步运行,因此 Controller 响应将立即发生,并且异步过程将在后台发生。
现在我想在所有过程完成后触发另一个处理。 有没有什么方式或方法只有在完成ForkJoinPool提交后才执行。
我尝试了 submit.isDone 和 submit.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/