Fork / Join 框架
使用工作窃取(work-stealing)算法实现分而治之,可以把一个大任务拆分成若干小任务,用有限的线程去队列里抢任务做,
减少线程数量,缩短线程闲置时间,提高 cpu 利用率
ForkJoinPool 的每个工作线程都维护着一个工作队列(WorkQueue), 这是一个双端队列(Deque), 里面存放任务(ForkJoinTask), 每个工作线程产生新的任务会放入工作队列的队尾, 会使用 LIFO 方式从队尾取出任务来执行,
同时会使用 FIFO 方式从其他工作线程的工作队列队首窃取任务执行,在遇到 join() 时,会先处理其他任务,并等待其完成
----------------------------------------
ForkJoinPool
用来执行 Task,内部会创建 ForkJoinWorkerThread 和 WorkQueue,实现 work-stealing 逻辑
ForkJoinTask 执行具体的分支逻辑
WorkQueue 保存要执行的 ForkJoinTask
RecursiveTask 需要返回值的任务
RecursiveAction 不需要返回值的任务
ForkJoinTask.invokeAll() 调用子任务
ForkJoinTask.join() 阻塞方法,等待子任务执行完成并返回结果
ForkJoinPool.invoke() 同步执行
ForkJoinPool.execute() 异步执行