头图

上一篇讲解到了addWorker方法,那么Worker是什么东西呢?

image.png
595行:Worker类的声明,继承了aqs类,实现了runnable接口

image.png
616行:worker的构造方法,thread的是通过worker本身对象生成的

image.png
933行:获得worker里面的thread
957行:调用thread的start方法
根据616行可以得出结论,start运行的就是worker的run方法
image.png
623行:worker的run方法内容,调用了runWorker方法

runWorker方法又是什么样的呢?

image.png
1129行:取出worker里面的task任务
1131行:锁允许中断
1134行:如果task是null,调用getTask方法获取task任务
1140行:判断线程是否终止
image.png
1146行:和1157行一样,都是线程池开放的钩子,可以自己实现一个线程池
1149行:执行task的内容

getTask方法又是什么情况呢?

image.png
1047行:标志位,代表阻塞获取任务是否超时
1049行:死循环,获取任务
1045行:如果线程池的状态是stop以上或者是shutdown并且阻塞队列为空,返还空任务
1062行:timed通过是否运行核心死亡和当前线程数判断是否要消亡线程
1072行:根据timed执行不同的获取任务的方法,poll一段时间内阻塞,take一直阻塞
1073行:poll获取不到任务的情况下,下一次进入就会进入1064行,返回null消亡线程
image.png
1134行:getTask返回null后就跳出死循环,进入1167行

processWorkerExit消亡线程做了什么?

image.png
1002行:判断标志位,进入方法前是否已经减了一次线程数
1008行:处理任务数汇总
1009行:从工作任务队列移除工作任务
1016行:这里之后的代码,主要目的是维护线程数,保证有足够的线程处理任务

至此线程池源码讲解完毕


幻想的绝望
1 声望0 粉丝

在绝望中追寻