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

源码解析:ThreadPoolExecutor(1)

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

针对ThreadPoolExecutor的源码解析,由于篇幅较长,如果写在一篇里担心会对大家的阅读造成一定的阻碍,故此将其拆分为几篇文章。具体的目录如下所示:

大家可以针对感兴趣的部分进行阅读。那么闲话少叙,我们来进入正题。

一、线程池概念介绍

1.1> 什么是线程池

  • 池化技术其实在技术生态圈中是比较常见的,比如:对象池、连接池等等。而今天我们要深入源码了解的就是线程池。那为什么会有线程池这个东西存在呢?其实原因跟其他池化技术是一样的,都是由于创建对象、连接、线程等操作时是比较“重”的,耗时的,高成本的。针对与这种场景,我们都会采用能复用就复用,而不是每次都要重新的去创建一遍,那么在性能的提升、资源的利用率上,都能获得非常理想的效果。
  • 在介绍线程池之前,我们先插入一个小内容,就是线程状态流转,作为我们对于线程的知识补充。
  • 线程池这个知识点其实应该算是“最熟悉的陌生人”了:熟悉——是因为这么多年了,依然是面试题中出勤率非常高的问题,对于其工作流程很多同学都已经烂熟于心。而陌生——是因为我们日常开发中,对于多线程的使用一般是尽量“避而远之”的,取代方案我们会采用mq多consumer的方式去加快任务处理。尤其是针对于线程池的源码,也是有很大一部分同学们是没有仔细看过的。比如:线程池如何实现的线程复用呢?在实际的面试过程中,能够完整回答上来的也并不多。
  • 那么,针对于这种“最熟悉的陌生人”,我们还是先把它为人熟知的内容拿出来大家一起回味一下吧。

1.2> 线程池工作流程

  • 线程池的工作原理大致分为4步,如下图所示:

【解释】

  • 首先,当有任务要执行的时候,会计算线程池中存在的线程数量与核心线程数量(corePoolSize)进行比较,如果小于,则在线程池中创建线程,否则,进行下一步判断。
  • 其次,如果不满足上面的条件,则会将任务添加到阻塞队列(1.6 阻塞队列)中。等待线程池中的线程空闲下来后,获取队列中的任务进行执行。
  • 第三,如果队列中也塞满了任务,那么会计算线程池中存在的线程数量与最大线程数量(maxnumPoolSize)进行比较,如果小于,则在线程池中创建线程。
  • 最后,如果上面都不满足,则会执行对应的拒绝策略(1.5 拒绝策略)。

好了,以上四点我猜测,大多数的同学们都是知道了,毕竟也是“面试宝典”中的标准答案了。那么,下面我们就进入源码分析阶段,看一看,除了这种标准答案之外,我们错过了哪些好玩的东西。


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

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

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

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

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、线程池概念介绍
    • 1.1> 什么是线程池
      • 1.2> 线程池工作流程
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
      http://www.vxiaotou.com