ForkJoinPool实现原理和源码解析

这是在部门做技术分享的时候写的一篇学习笔记,顺便贴在这里给大家看看,欢迎指出错误,共同学习

ForkJoin是什么

ForkJoin是用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。Fork就是把一个大任务切分为若干子任务并行的执行,Join就是合并这些子任务的执行结果,最后得到这个大任务的结果。
在这里插入图片描述

数据结构

在这里插入图片描述

关键调用图

在这里插入图片描述

源码解析

1、pool属性

    // Instance fields
    volatile long ctl;                   // 控制中心:非常重要,看下图解析
    volatile int runState;               // 负数是shutdown,其余都是2的次方
    final int config;                    // 配置:二进制的低16位代表 并行度(parallelism),
																					//高16位:mode可选FIFO_QUEUE(1 << 16)和LIFO_QUEUE(1 << 31),默认是LIFO_QUEUE
    int indexSeed;                       // 生成worker的queue索引
    volatile WorkQueue[] workQueues;     // main registry
    final ForkJoinWorkerThreadFactory factory;
    final UncaughtExceptionHandler ueh;  // per-worker UEH
    final String workerNamePrefix;       // to create worker name string
    volatile AtomicLong stealCounter;    // also used as sync monitor

2、控制中心:ctl

在这里插入图片描述

3、WorkQueue

        // Instance fields
        volatile int scanState;    // 负数:inactive, 非负数:active, 其中奇数代表scanning
        int stackPred;             // sp = (int)ctl, 前一个队列栈的标示信息,包含版本号、是否激活、以及队列索引
        int nsteals;               // 窃取的任务数
        int hint;                  // 一个随机数,用来帮助任务窃取,在 helpXXXX()的方法中会用到
        int config;                // 配置:二进制的低16位代表 在 queue[] 中的索引,
																	 // 高16位:mode可选FIFO_QUEUE(1 << 16)和LIFO_QUEUE(1 << 31),默认是LIFO_QUEUE
        volatile int qlock;        // 锁定标示位:1: locked, < 0: terminate; else 0
        volatile int base;         // index of next slot for poll
        int top;                   // index of next slot for push
        ForkJoinTask<?>[] array;   // 任务
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值