十二、线程池的核心模型Worker对象的运作流程是怎样的?

参考的资料:《码》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)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值