每天都在用,但你知道 Tomcat 的线程池有多努力吗? (4)

简介: 每天都在用,但你知道 Tomcat 的线程池有多努力吗? (4)

Dubbo 线程池


这里再扩展一个 Dubbo 的线程池实现。


org.apache.dubbo.common.threadpool.support.eager.EagerThreadPoolExecutor

你可以看一下,思想还是这个思想:


但是 execute 方法有点不一样:


从代码上看,这里放入失败之后又立马调了一次 offer 方法,且没有等待时间。


也就是说两次 offer 的间隔是非常的短的。


其实我不太明白为什么这样去写,可能是作者留着口子好扩展吧?


因为如果这样写,为什么不直接调用这个方法呢?


java.util.concurrent.LinkedBlockingQueue#offer(E)

也是作者是想在极短的时间能赌一下吧?谁知道呢?


然后可以发现该线程池在拒绝策略上也做了很大的文章:


可以看到日志打印的非常详尽,warn 级别:


dumpJStack 方法,看名字也知道它是要去 Dump 线程了,保留现场:


在这个方法里面,他用了 JDK 默认的线程池,去异常 Dump 线程。


等等,阿里开发规范不是说了不建议用默认线程池吗?


其实这个规范看你怎么去拿捏。在这个场景下,用自带的线程池就能满足需求了。


而且你看第二个红框:提交之后就执行了 shutdown 方法,上面还给了个贴心警告。


必须要 shutdown 线程池,不然会导致 OOM。


这就是细节呀,朋友们。魔鬼都在细节里!


这里为什么用的 shutdown 不是 shutdownNow ?他们的区别是什么?为什么不调用 shutdown 方法会 OOM?


知识点呀,朋友们,都是知识点啊!


好了,到这里本文的分享也到了尾声。


以后当面试官问你 JDK 线程池的运行流程的时候,你答完之后画风一转,再来一个:


其实我们也可以先把最大线程数用完,然后再让任务进入队列。通过自定义队列,重写其 offer 方法就可以实现。目前我知道的 Tomcat 和 Dubbo 都提供了这样策略的线程池。

轻描淡写之间又装了一个漂亮逼。让面试官能进入下一个知识点,让你能更多的展现自己。


最后说一句(求关注)


本文主要介绍了 Tomcat 线程池的运行流程,和 JDK 线程池的流程比起来,它确实不一样。


而 Tomcat 线程池为什么要这样做呢?


其实就是因为 Tomcat 处理的多是 IO 密集型任务,用户在前面等着响应呢,结果你明明还能处理,却让用户的请求入队等待?


这样不好,不好。


说到底,又回到了任务类型是 IO 密集型还是 CPU 密集型这个话题上来。


有兴趣的可以看看我的这篇文章:《如何设置线程池参数?美团给出了一个让面试官虎躯一震的回答。》


点个赞吧,周更很累的,不要白嫖我,需要一点正反馈。


感谢您的阅读,我坚持原创,十分欢迎并感谢您的关注。


我是why技术,一个不是大佬,但是喜欢分享,又暖又有料的四川好男人。

 

欢迎关注公众号【why不止技术】,坚持输出原创。分享技术、品味生活,愿你我共同进步。

目录
相关文章
|
4天前
|
Java 应用服务中间件
Springboot启动的时候初始化的线程池默认配置tomcat
Springboot启动的时候初始化的线程池默认配置tomcat
22 1
|
10月前
|
Java 应用服务中间件 调度
Tomcat 线程池
Tomcat 线程池
|
7月前
|
Java 应用服务中间件
98分布式电商项目 - Tomcat性能优化(使用线程池)
98分布式电商项目 - Tomcat性能优化(使用线程池)
32 0
|
9月前
|
网络协议 Java 应用服务中间件
详解Tomcat的连接数与线程池,调优必备
详解Tomcat的连接数与线程池,调优必备
|
Java 应用服务中间件 Apache
Tomcat 线程池学习总结
Tomcat 线程池学习总结
418 0
|
监控 算法 Java
每天都在用,但你知道 Tomcat 的线程池有多努力吗? (3)
每天都在用,但你知道 Tomcat 的线程池有多努力吗? (3)
100 0
|
Java 应用服务中间件
每天都在用,但你知道 Tomcat 的线程池有多努力吗? (2)
每天都在用,但你知道 Tomcat 的线程池有多努力吗? (2)
216 0
|
Java 应用服务中间件 程序员
每天都在用,但你知道 Tomcat 的线程池有多努力吗? (1)
每天都在用,但你知道 Tomcat 的线程池有多努力吗? (1)
116 0
|
监控 Java 应用服务中间件
美团动态线程池思路开源框架(DynamicTp),动态调整Tomcat、Jetty、Undertow线程池参数篇
大家好,这篇文章我们来介绍下动态线程池框架(DynamicTp)的adapter模块,上篇文章也大概介绍过了,该模块主要是用来适配一些第三方组件的线程池管理,让第三方组件内置的线程池也能享受到动态参数调整,监控告警这些增强功能。
722 1
美团动态线程池思路开源框架(DynamicTp),动态调整Tomcat、Jetty、Undertow线程池参数篇
|
前端开发 JavaScript Java
Tomcat使用线程池配置高并发连接
Tomcat使用线程池配置高并发连接1:配置executor属性 打开/conf/server.xml文件,在Connector之前配置一个线程池: namePrefix="tomcatThreadPool-" maxThreads="1000" maxIdleTime="300000" minSpareThreads="200"/> 重要参数说明:name:共享线程池的名字。
1862 0