核心思想:分而治之,fork给出子任务,join获取子任务结果
ForkJoinPool,ForkJoinWorkerThread,ForkJoinTask
ForkJoinPool:继承AbstractExecutorService,含工作队列数组,奇数队列对应某线程,偶数队列代表来自外部提交任务
ForkJoinWorkerThread:含自己的工作队列,不仅运行自己队列任务,还窃取其他队列
循环中,尝试窃取任务,运行窃取的任务后再运行剩余的自己队列的任务,继续窃取
记住:线程工作队列一般是没有任务的,一般是窃取任务运行中加入了某些任务在线程队列里,加入的任务可能被其他线程窃取,也可能自己在join的时候运行,也可能运行完当前任务后接着运行
新任务放top,窃取base,即FIFO,运行自己队列任务从top开始,即LIFO,避免竞争
ForkJoinTask:(是Future,也是可执行实体,含exec方法, RecursiveAction无结果计算,RecursiveTask有结果计算)
fork(当前线程为workerThread,则任务放入当前线程的队列,否则放入common池)
join(自己是外部线程则等待,是workerThread可能等待可能自己执行(任务在队列的top))