ForkJoinPool 源码

Posted chuliang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ForkJoinPool 源码相关的知识,希望对你有一定的参考价值。

ForkJoinPool----FJP
先看task.fork方法,含义是将当前任务,放到当前线程的工作队列中。但是第一次执行这个方法是在主线程中,主线程是不可能被FJP管理的。那么就进入ForkJoinPool.common.externalPush,在common这个default的线程池里执行这个任务,
externalPush的意思,是把外面的任务,放到当前线程池中执行。刚进入externalPush,会检查随机数不是0,workQueues不是空,这些条件第一次肯定是不满足的,那么进入externalSubmit,先初始化随机数,

ctl是一个volatile long类型的控制变量,从高到低,前16位是(当前活跃线程数-最小并发数),往后16位是(总线程数-最小并发数),再往后16位是栈顶(Treiber stack)等待线程的标志,最后16位是栈顶等待线程在线程池数组中的位置。
runState是一个volatile int类型的控制变量,来标志当前线程池运行状态,有锁住,信号,已启动,停止,终止,关闭几种状态。

当然也可以不从fork方法进来,而是pool.invoke,已经有一个FJP了,直接执行任务




以上是关于ForkJoinPool 源码的主要内容,如果未能解决你的问题,请参考以下文章

死磕 java线程系列之ForkJoinPool深入解析

CompletableFuture源码分析以及例子实证

提升--18---线程池--04----WorkStealingPool ForkJoinPool

ForkJoinPool.commonPool() 和 new ForkJoinPool(availableCPU - 1) 有啥区别?

多线程 ForkJoinPool

Java:ForkJoinPool的简单使用