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 源码的主要内容,如果未能解决你的问题,请参考以下文章
提升--18---线程池--04----WorkStealingPool ForkJoinPool
ForkJoinPool.commonPool() 和 new ForkJoinPool(availableCPU - 1) 有啥区别?