ForkJoin

核心概念

核心思想: 分治算法
核心思想: work-stealing(工作窃取)算法

WorkQueue双端队列
任务对象: ForkJoinTask (包括RecursiveTask、RecursiveAction 和 CountedCompleter)
执行Fork/Join任务的线程: ForkJoinWorkerThread
线程池: ForkJoinPool

Fork/Join 框架的执行流程

alt

实际运用

注意顺序f1.fork(),f2.fork(), f2.join(),f1.join()
invokeAll(),不用太关系顺序

JDK源码中的运用:

特别注意IO密集型,容易导致全局ForkJoinPool.common阻塞。

Arrays.parallel**();

1
2
3
default Stream<E> parallelStream() {
return StreamSupport.stream(spliterator(), true);
}
1
2
3
4
5
// 设置全局并行流并发线程数
System.setProperty("java.util.concurrent.ForkJoinPool.common.parallelism", "12");
System.out.println(ForkJoinPool.getCommonPoolParallelism());// 输出 12
System.setProperty("java.util.concurrent.ForkJoinPool.common.parallelism", "20");
System.out.println(ForkJoinPool.getCommonPoolParallelism());// 输出 12

https://www.pdai.tech/md/java/thread/java-thread-x-juc-executor-ForkJoinPool.html