参考的资料:《码》P244-P249
值得一看的文章:https://blog.csdn.net/qq_28165595/article/details/105466772
1.首先要从线程池ThreadPoolExecutor讲起:
1)众所周知线程池有5个生命周期(这里不再展开),启动线程池时有7个参数需要配置,之前已经提及。
2)当线程池需要增加一个线程来工作时,这时会启动addWorker方法,ThreadPoolExecutor.Worker在线程池中被封装为一个工作线程对象
addWorker方法要传入firstTask和core
①首先获取当前线程数然后进行循环校验
②判断线程池的状态(是否开启、是否处于SHUTDOWN或STOP之后的状态)没达到RUNNING状态会直接返回
③然后尝试对请求活动数+1
④开始创建工作线程worker
⑤创建时会获取线程池的ReentrantLock主锁,避免在添加和启动线程时干扰
⑥真正地增加Worker线程,并且更新相关记录信息,如当前运行期间的最大并发任务个数
⑥做完这些操作之后进行解锁,然后启动这个新的worker线程,t.start()
⑦如果线程启动失败,需要把工作线程数(活动线程数)-1
2.Worker对象的运作流程
1)首先Worker对象继承了AQS(AbstractQueuedSynchronizer),并实现了Runnable接口
它在初始化时会传入firstTask,并且赋值给Worker内部维护的一个firstTask,它会禁止线程被中断,使用了AQS的setState(-1)方法
并使用线程工厂方法实例化该线程对象
2)Worker对象的run方法主要在thread被start()之后,执行runWorker的方法
3)runWoker方法
①解锁,允许线程被打断
②会对firstTask进行一个消费
③或者使用getTask获取任务然后执行
④执行完对该worker加锁,进行worker回收处理(完成线程数+1,移除worker)