17 | Executor组件:Tomcat如何扩展Java线程池?
该思维导图由 AI 生成,仅供参考
Java 线程池
- 深入了解
- 翻译
- 解释
- 总结
Tomcat的线程池是一个定制版的ThreadPoolExecutor,通过扩展Java原生线程池实现了对线程池的扩展,以满足Web容器高并发的需求。Tomcat的线程池对线程数和任务队列长度都进行了限制,定制了自己的任务处理流程。它重写了execute方法,实现了在总线程数达到最大数时,尝试向任务队列添加任务,添加失败后再执行拒绝策略。此外,Tomcat还实现了定制版的任务队列TaskQueue,重写了offer方法,使得在任务队列长度无限制的情况下,线程池仍然有机会创建新的线程。通过这些定制化的实现,Tomcat的线程池能够更好地适应高并发环境,提高程序的性能和并发处理能力。
《深入拆解 Tomcat & Jetty 》,新⼈⾸单¥68
全部留言(47)
- 最新
- 精选
- 永光观察 Tomcat 线程池和 Java 原生线程池的区别,其实就是在第 3 步,Tomcat 在线程总数达到最大数时,不是立即执行拒绝策略,而是再尝试向任务队列添加任务,添加失败后再执行拒绝策略。 问题: 感觉这两种方式都一样呀,前corePoolSize都是直接创建线程来处理。后续都是先放在队列里面,满了在创建临时线程来处理。 Tomcat线程池,在达到max时 再次检测,并尝试插入队列有什么意义呢?我理解再次检测队列也是满的呀? 2、
作者回复: 有可能第一次尝试放队列是满的,失败,再尝试创建临时线程,也满了,但是这个过程中,队列中的任务可能被临时线程消费了一部分,再往队列中送可能会成功。
2019-06-18830 - 世纪猛男关于今日的思考题 getPoolSize. 用Volatile去修饰一个变量不可行,因为变更过程,会基于之前的pool size,无法做到原子操作。 用atomic 也不合适 并发量高的时候 会导致 大量的更新失败, 持续消耗CPU。 所以还不如加锁来的痛快。 请教老师的想法
作者回复: 可以加锁,但是没有必要多次调用,调一次把结果存起来就行。
2019-06-1879 - 吃饭饭老师,TaskQueue 重写了 offer 方法的关键是什么?是 TaskQueue(int capacity) ,只是把无界变有界了吗?每台看明白 offer 具体的改变是什么
作者回复: offer方法返回false表示添加失败,添加失败就会创建新线程。 TaskQueue的父类总是返回true,但是TaskQueue就不会总是返回true了,可能是false,区别在这里。
2019-07-1757 - 迎风劲草老师,核心线程如果超过keeplive时间,是否也会回收?还有如果我的队列中还有等待执行的runable,这时候kill 进程,时候需要等到所有runable被执行要,进程才结束吗?
作者回复: 1.可以调用ThreadPoolExecutor的这个方法来指定是否回收核心线程: public void allowCoreThreadTimeOut(boolean value) 2.kill进程会立即退出,内核会负责清理这个进程的所有资源。
2019-06-185 - 13963865700老师,您好,请问: 1.Tomcat在默认队列长度无限制的情况下,是不是不会触发拒绝策略,即使线程数达到maxQueueSize也一直把任务放队列中? 2.这种情况会不会拖垮Tomcat,发生内存溢出?
作者回复: 为了解决这个问题,Tomcat的定制版任务队列TaskQueue 重写了 LinkedBlockingQueue 的 offer 方法,在合适的时机返回 false,返回 false 表示任务添加失败,这时线程池会创建新的线程。
2019-06-2624 - -W.LI-李老师好。我有个问题,原生队列是在队列满时新建线程处理。然后当线程达到最大线程数的时候,不就是队列已满,线程也开满了么。Tomcat补获异常后再往队列里放一次,只是为了做后的努力争取不丢任务么?
作者回复: 对的
2019-06-204 - z.l感觉直接读workers.size()就可以了么,因为创建线程和销毁线程的方法都加锁了,而且是同一把锁,不懂为啥getPoolSize()方法还要额外加锁?
作者回复: 是的,这个地方Tomcat的实现可以简化。
2019-06-1834 - HARDMAN请教老师,如果线程池已满,任务队列也满了,那么tomcat会拒绝后面的请求,这时如何进一步增强tomcat的处理能力,让它能同时处理更多请求呢?
作者回复: 只能提高web应用的处理速度,否则只能排队,可以把队列长度加大,不推荐这样做,因为客户端需要等较长时间,个人感觉还不如直接返回错误
2019-07-063 - yang结合老师的讲解去看,印象会更深刻,脉络和细节点也会变得清晰,给老师点赞!
作者回复: 谢谢
2019-08-13 - 陆离corePoolSize的有什么设置的策略吗? 需要和CPU个数联系起来吗?
作者回复: 如何是纯粹的CPU密集型应用,corepoolsize可以设置为CPU核数
2019-06-18