Forkjoin框架原理解析

Forkjoin框架原理解析声明 本篇博客是在阅读了引用博客的两篇文章后做了简短的概括与归纳 只作为自己笔记文章目录一 思想二 工作窃取算法三 demo 用例四 关键组件 ForkJoinPool 五 Fork Join 运行流程图任务提交创建线程 signalWork 方法任务执行六 引用博客一 思想 Fork Join 是 Java7 提供的并行执行

声明:本篇博客是在阅读了引用博客的两篇文章后做了简短的概括与归纳,只作为自己笔记

一、思想

Fork/Join是Java7提供的并行执行任务的框架,是一个把大人物分割成若干小任务,最终汇总小任务的结果得到大任务结果的框架

小任务可以继续拆分为更小的任务

二、工作窃取算法

1、工作窃取会选择双端队列作为存储任务的数据结构,默认正常线程会选择LIFO(栈获取)的方式,从当前双端队列的尾部获取任务;窃取线程会选择FIFO(队列获取)方式,从当前双端队列的头部获取任务

三、demo用例

通过Fork/Join并行计算1+2+3+4

import java.util.concurrent.ExecutionException; import java.util.concurrent.ForkJoinPool; import java.util.concurrent.Future; import java.util.concurrent.RecursiveTask; public class ForkjoinDemo extends RecursiveTask 
  
    { private long start; private long end; public static final int THRESHOLD = 2; public ForkjoinDemo(long start, long end) { this.start = start; this.end = end; } @Override protected Long compute() { long sum = 0; boolean flag = (end - start) <= THRESHOLD; if (flag) { for (long i = start; i <= end; i++) { sum += i; } } else { long middle = (end + start) / 2; // divide task ForkjoinDemo leftTask = new ForkjoinDemo(start, middle); ForkjoinDemo rightTask = new ForkjoinDemo(middle+1 , end); // execute sub task leftTask.fork(); rightTask.fork(); // get result sub task long left = leftTask.join(); long right = rightTask.join(); sum = left + right; } return sum; } public static void main(String[] args) { ForkJoinPool pool = new ForkJoinPool(); ForkjoinDemo task = new ForkjoinDemo(1, 4); Future 
   
     result = pool.submit(task); try { System.out.println(result.get()); } catch (InterruptedException | ExecutionException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } 
    
  

四、关键组件

ForkJoinPool

ForkJoinTask

ForkJoinWorkerThread

任务处理原则:首先根据同步/异步模式从任务队列选择任务,如果完成自身任务,通过窃取算法获取其他线程的任务

WorkQueue

底层是通过数组实现的双端队列,容量为2的幂次,任务队列在首次调用线程池外部方法提交任务之后初始化任务队列,通过ThreadLocalRandom.probe来计算出任务队列在数组中的索引位置(外部方法调用产生的索引一定是偶数),没有绑定工作线程

五、Fork/Join运行流程图

在这里插入图片描述

任务提交

创建线程signalWork方法

任务执行

六、引用博客

极力推荐并发系列博客:https://segmentfault.com/a/81127

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/221222.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午6:37
下一篇 2026年3月17日 下午6:38


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号