首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >源码解析:ThreadPoolExecutor(7)

源码解析:ThreadPoolExecutor(7)

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

五、源码解析—— getTask()

  • getTask的代码逻辑并不复杂,关键注释我也已经写在源码上了,大家看一下就会理解的:

【解释】

在第二个红框处,我们就找到了keepAliveTime的身影,那这是会有同学问,为什么用的是TimeUnit.NANOSECONDS啊?构造函数的入参里不是有unit可以指定吗?难道没有生效吗?其实不是这样的。而是在构造函数中,已经提前把keepAliveTime统一转换为纳秒为单位了。如下所示:


六、源码解析—— reject(Runnable command)

  • 最后关于拒绝策略这块,其实没什么好说了,最终调用的就是handler的rejectedExecution方法。
  • 而RejectedExecutionHandler handler的四个实现类,就如截图所示:

七、结束语

  • 到此,线程池的源码解析也就告一段落了。其中,关于阻塞队列SynchronousQueue的实现原理,还是非常非常有意思的。正式由于它,才影响了newCachedThreadPool的最终执行行为。而网上关于newCachedThreadPool的解释也大多很简单,并没有真正的解释清楚它真正的处理流程。后续会再单独开辟几篇小文章,来深度解析一下SynchronousQueue的“魅力之处”。

八、附录:阅读源码所需的部分线程知识点

8.1> interrupt()、interrupted()和isInterrupted()

  • public void interrupt()

其作用是中断此线程(此线程不一定是当前线程,而是指调用该方法的Thread实例所代表的线程),但实际上只是给线程设置一个中断标志,线程仍会继续运行。

  • public static boolean interrupted()

作用是测试当前线程是否被中断(检查中断标志),返回一个boolean并清除中断状态,第二次再调用时中断状态已经被清除,将返回一个false。

  • public boolean isInterrupted()

作用是只测试此线程是否被中断 ,不清除中断状态

8.2>BlockingQueue定义的常用方法

  • BlockingQueue定义的常用方法如下:
  • add(anObject)

把anObject加到BlockingQueue里,即如果BlockingQueue可以容纳,则返回true,否则招聘异常

  • offer(anObject)

表示如果可能的话,将anObject加到BlockingQueue里,即如果BlockingQueue可以容纳,则返回true,否则返回false.

  • put(anObject)

把anObject加到BlockingQueue里,如果BlockQueue没有空间,则调用此方法的线程被阻断直到BlockingQueue里面有空间再继续.

  • poll(time)

取走BlockingQueue里排在首位的对象,若不能立即取出,则可以等time参数规定的时间,取不到时返回null

  • take()

取走BlockingQueue里排在首位的对象,若BlockingQueue为空,阻断进入等待状态直到Blocking有新的对象被加入为止

其中:BlockingQueue 不接受null 元素。试图addputoffer 一个null 元素时,某些实现会抛出NullPointerExceptionnull 被用作指示poll 操作失败的警戒值。


源码解析:ThreadPoolExecutor (完)

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 五、源码解析—— getTask()
  • 六、源码解析—— reject(Runnable command)
  • 七、结束语
  • 八、附录:阅读源码所需的部分线程知识点
    • 8.1> interrupt()、interrupted()和isInterrupted()
    • 8.2>BlockingQueue定义的常用方法
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档