Java 仅在 ForkJoinPool 提交后执行代码
Java execute code only after ForkJoinPool submit
我有 1 个并行处理代码使用 ForkJoinPool:
ForkJoinPool customThreadPool = new ForkJoinPool(4);
customThreadPool.submit(() -> {
list.parallelStream().forEach(this::process);
});
我正在通过一些控制器调用它。此代码异步运行,因此控制器响应将立即发生,异步过程将在后台发生。
现在我想在所有过程完成后触发另一个处理。
ForkJoinPool提交完成后,有没有什么方式或方法才执行。
我尝试了 submit.isDone 和 submit.isCompletedNormally 但这不是在提交完成后立即运行。
submit
方法returns一个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 的顺序不确定,但 done 总是最后的
我有 1 个并行处理代码使用 ForkJoinPool:
ForkJoinPool customThreadPool = new ForkJoinPool(4);
customThreadPool.submit(() -> {
list.parallelStream().forEach(this::process);
});
我正在通过一些控制器调用它。此代码异步运行,因此控制器响应将立即发生,异步过程将在后台发生。
现在我想在所有过程完成后触发另一个处理。 ForkJoinPool提交完成后,有没有什么方式或方法才执行。
我尝试了 submit.isDone 和 submit.isCompletedNormally 但这不是在提交完成后立即运行。
submit
方法returns一个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 的顺序不确定,但 done 总是最后的