性能文章>空中楼阁之纸上谈兵 线程池执行流程图>

空中楼阁之纸上谈兵 线程池执行流程图原创

1年前
566801

一、jdk中的线程池

线程池java.util.concurrent.ThreadPoolExecutor中execute方法执行流程图如下
image.png
image.png


如图所示,要想扩展线程池,任务队列是否已满部分可以进行重写,即扩展BlockQueue,如tomcat、dubbo中都是自己新建了TaskQueue,其继承自LinkedBlockQueue,并重写了offer方法。
另需要继承java.util.concurrent.ThreadPoolExecutor,并重写execute方法,并扩展afterExecute方法。


备注:
流程图中的线程池假设线程池的状态是运行状态
另线程池状态变化如下图所示
image.png


二、扩展

1、tomcat下的线程池

tomcat中的ThreadPoolExecutor的execute方法如下
image.png

tomcat的TaskQueue中重写部分的执行流程图如下
image.png
image.png


2、dubbo下的线程池

dubbo的EagerThreadPoolExecutor的execute方法如下
image.png

dubbo的TaskQueue中重写部分的执行流程图如下
image.png
image.png


总结:
1、首先要明确,能执行到添加任务到队列中,当前的线程数必然达到了核心线程数;
2、其次,线程池的目的是为了快速执行任务为目标,那么当任务有积压时,这时最好能将线程数提高到最大,这样资源利用率才能最大化;
3、综上所述:先利用已经创建好的线程,执行刚添加的任务;
其次,为了加快执行效率,避免任务积压过多,先将线程数扩展到最大;
最后,再将任务进行积压。


欢迎各位批评指正,共同学习进步^_^😊

点赞收藏
分类:标签:
青叶竹
请先登录,感受更多精彩内容
快去登录吧,你将获得
  • 浏览更多精彩评论
  • 和开发者讨论交流,共同进步

为你推荐

没有二十年功力,写不出Thread.sleep(0)这一行“看似无用”的代码!

没有二十年功力,写不出Thread.sleep(0)这一行“看似无用”的代码!

填坑来了!关于“Thread.sleep(0)这一行‘看似无用’的代码”里面留下的坑。

填坑来了!关于“Thread.sleep(0)这一行‘看似无用’的代码”里面留下的坑。

【译】记一次数据库连接泄漏导致的响应迟缓

【译】记一次数据库连接泄漏导致的响应迟缓

【全网首发】微服务10:系统服务熔断、限流

【全网首发】微服务10:系统服务熔断、限流

【全网首发】MQ-消息堆积-JDK Bug导致线程阻塞案例分析

【全网首发】MQ-消息堆积-JDK Bug导致线程阻塞案例分析

记一次“雪花算法”造成的生产事故的排查记录

记一次“雪花算法”造成的生产事故的排查记录

1
0