概述
对大任务,分而治之
适合CPU密集型
工作现成之间可以窃取任务
都实现了Executor和ExecutorService接口,并继承了AbstractExecutorService抽类
两种任务类型:RecursiveAction(无结果)和RecursiveTask(有结果)
原理
线程池:commonPool
四个参数:
并行数、工作线程的创建、异常处理和模式指定等
抽象任务:ForkJoinTask
核心方法:fork、join
任务窃取
允许从任务队列的双端,窃取任务进行执行
双端队列:pop、push、poll
从队列尾部窃取:降低多线程的对队列的竞争
两个假设:
队列中较旧的任务,可能颗粒度比较大,仍然需要进一步拆分 -> 工作线程从头部获取任务来执行
最近提交的任务,缓存命中率可能较高 -> 始终选择最近提交的任务去执行
用处:
1、JDK8中的**CompletableFuture、并行流**
2、JDK21中的**虚拟线程**