Skip to the content.

首页

version: jdk17

Fork/Join(TODO)


ForkJoinPool

继承自AbstractExecutorService,工作窃取线程池,即当某个线程执行完自己的任务后,从另一个线程的双端队列中窃取任务来执行。

构造方法

属性

任务提交

调用externalSubmit方法,如果线程为当前线程池的ForkJoinWorkerThread则直接push到非共享模式的队列中,否则使用externalPush,根据线程探针哈希值找到工作队列数组中未绑定ForkJoinWorkerThread的工作队列加入,最后都会调用signalWork方法通知ForkJoinWorkerThread执行,如果数量不足则创建ForkJoinWorkerThread。

调度过程

工作队列数组大小为2的幂,初始化时为空数组,任务提交后在偶数槽添加一个没有绑定工作线程的工作队列,然后创建工作线程,将其工作队列放置在奇数槽上,然后扫描工作队列数组,找到一个可以窃取的工作队列,获取到ForkJoinTask后执行,而ForkJoinTask的fork方法又会将任务添加到当前工作线程的工作队列中,最终ForkJoinTask中的join方法又会导致当前工作线程阻塞等待结果,因为可能被其他工作线程窃取走了任务。

WorkQueue

工作队列,为ForkJoinTask数组,由ForkJoinWorkerThread持有。

ForkJoinWorkerThread

ForkJoinPool中的worker,持有ForkJoinPool和WorkQueue,run方法将WorkQueue注册到ForkJoinPool,再调用ForkJoinPool执行WorkQueue的任务。

ForkJoinTask

抽象类,Fork/Join框架的核心,一般需要继承其抽象子类RecursiveAction和RecursiveTask,然后实现compute方法。核心是将任务拆分为小任务,然后小任务通过fork方法提交到ForkJoinPool异步执行,最后使用join方法等待小任务执行完成后合并计算结果。