每天都在用,但你知道 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不止技术】,坚持输出原创。分享技术、品味生活,愿你我共同进步。

目录
相关文章
|
3月前
|
Java 应用服务中间件
面对海量网络请求,Tomcat线程池如何进行扩展?
【10月更文挑战第4天】本文详细探讨了Tomcat线程池相较于标准Java实用工具包(JUC)线程池的关键改进。首先,Tomcat线程池在启动时即预先创建全部核心线程,以应对启动初期的高并发请求。其次,通过重写阻塞队列的入队逻辑,Tomcat能够在任务数超过当前线程数但未达最大线程数时,及时创建非核心线程,而非等到队列满才行动。此外,Tomcat还引入了在拒绝策略触发后重新尝试入队的机制,以提高吞吐量。这些优化使得Tomcat线程池更适应IO密集型任务,有效提升了性能。
面对海量网络请求,Tomcat线程池如何进行扩展?
|
3月前
|
Dubbo Java 应用服务中间件
剖析Tomcat线程池与JDK线程池的区别和联系!
剖析Tomcat线程池与JDK线程池的区别和联系!
206 0
剖析Tomcat线程池与JDK线程池的区别和联系!
|
8月前
|
Java 应用服务中间件
Springboot启动的时候初始化的线程池默认配置tomcat
Springboot启动的时候初始化的线程池默认配置tomcat
211 1
|
8月前
|
域名解析 安全 Java
SpringBoot启动的时候初始化的线程池默认配置tomcat
SpringBoot启动的时候初始化的线程池默认配置tomcat
88 1
|
Java 应用服务中间件 调度
Tomcat 线程池
Tomcat 线程池
|
Java 应用服务中间件
98分布式电商项目 - Tomcat性能优化(使用线程池)
98分布式电商项目 - Tomcat性能优化(使用线程池)
72 0
|
网络协议 Java 应用服务中间件
详解Tomcat的连接数与线程池,调优必备
详解Tomcat的连接数与线程池,调优必备
|
存储 Java 应用服务中间件
|
3月前
|
安全 应用服务中间件 网络安全
Tomcat如何配置PFX证书?
【10月更文挑战第2天】Tomcat如何配置PFX证书?
318 7