前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >源码解析:ThreadPoolExecutor(6)

源码解析:ThreadPoolExecutor(6)

作者头像
爪哇缪斯
发布2023-05-09 21:47:47
860
发布2023-05-09 21:47:47
举报
文章被收录于专栏:爪哇缪斯

4.4> addWorkder的Part2解析

  • 我们先看一下Part2的源码和注释:
  • 在Part2的逻辑中,我们就真正的开始了线程池的操作了。这部分才是真正的“高潮”部分。我们来往下看。
  • 首先,我们new了一个Worker。Worker是什么东西呢?顾名思义,它是一个工人,一个线程池中负责给我们工作的工人,我们来看一下它的具体实现把:

【解释】

  • Worker是ThreadPoolExecutor的一个内部类,它虽然看着小,但是“五脏俱全”。
  • 首先:变量thread,它就是我们线程池中运行的那个线程。它被包含在了Worker中,藏得有些深哈~
  • 其次:getThreadFactory()方法,其实就是我们线程池构造方法中的那个入参ThreadFactory,它就是用来创建线程用的。
  • 之后:非常关键的一个方法,runWorker,线程池中关于线程复用的精华都在这个方法里了。
  • 其中,runWorker方法我们暂时先不深入进去,后面会介绍,我们还是回到Part2的部分,先一层一层的了解代码的实现逻辑,以免调用代码调用的“深渊”中。
  • 我们继续Part2部分,创建了Worker后,从Worker中获取线程t,如果线程t不为空的话,我们就去尝试加锁了,如果可以成功的获得锁,就可以向线程池(其实就是HashSet<Worker> workers)中添加线程了,不过在这之前,还需要任意的满足以下两个条件:
    • case1:线程池状态为RUNNING。
    • case2:线程池状态为SHUTDOWN并且firstTask为null。(什么是firstTask为null?其实就是单纯的创建线程,而不用附带执行firstTask的任务
  • 这一切执行完毕之后,在finally中调用了mainLock.unlock(),解开了锁。并且执行了t.start(),由于Worker是Runnable,所以,调用的其实就是Worker的run方法,而Worker的run方法里,调用了非常重要的那个方法——runWorker(this);

五、源码解析—— runWorker(Worker w)

  • 上面的逻辑中,我们的流程走到了runWorker方法中,那么现在,我们就来解开它的面纱。下面为方法的源码和注释:

【解释】

  • 从runWorker的代码逻辑中,我们能够看出来,它的主要处理逻辑就是执行外部指定的firstTask或者从阻塞队列中获得待执行的任务,然后调用run方法进行执行。
  • 同时也与Spring类似,提供了beforeExecute和afterExecute的前置和后置的处理。默认都是空的方法,如果我们需要,可以对其进行继承实现。
  • 那这个时候,就会有同学有疑问了,在介绍线程池构造方法入参的时候,不是有两个参数,是用来控制线程最大空闲时间的吗(keepAliveTime和unit),也就是说,超过这个时间,线程就消亡了。那么,怎么在源码中没有发现在哪呢?其实,他们都在获取队列中的任务getTask()方法中呢。我们下面将会对这个方法进行解析。

后面的内容,参见:源码解析:ThreadPoolExecutor(7)

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-10-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 爪哇缪斯 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 4.4> addWorkder的Part2解析
  • 五、源码解析—— runWorker(Worker w)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档