1.概述
在正式进入Tomcat线程池之前,小伙伴们可以先回顾一下JDK中的线程池相关特性,对于JDK线程池的总结和源码的解析感兴趣的童鞋,也可参考博主的层层剖析线程池源码的这篇文章,文章主要讲述对线程池的生命周期,核心参数,常用线程池以及线程池源码做了详细的介绍。
tomcat内部线程池的实现没有直接使用JUC下的ThreadPoolExecutor,而是选择继承JUC下的Executor体系类,然后重写execute()等方法,如下,为tomcat7.x下的线程池类图:
2. Tomcat 线程池源码
2.1 线程池初始化
在这个方法中,主要是初始化初始化org.apache.tomcat.util.threads.TaskQueue
,同时构造org.apache.tomcat.util.threads.ThreadPoolExecutor
的实例,org.apache.tomcat.util.threads.ThreadPoolExecutor
构造方法与Java原生的线程池并没有任何不同,核心逻辑是直接调用父类[java.util.concurrent.ThreadPoolExecutor
]的构造方法,只不过,在调用父类的构造方法之后,又调用了prestartAllCoreThreads(
)方法,用来预热核心线程。
2.2 核心逻辑–任务执行
在进入核心executor方法之前,先上图,演示tomcat线程池中的线程池是怎么处理提交过来的任务,小伙伴可仔细观察与原生JDK线程处理有何异同:
是不是很奇怪,与我们JDK线程池老八股文貌似有很大不同,这里是核心线程数如果满了,就判断最大线程数是否已经满了,如果没有满,则创建最大线程数;而JDK的原生线程池的的处理流是:
2.2.1 org.apache.tomcat.util.threads.TaskQueue
2.2.1.2 TaskQueue#offer方法
2.3 tomcat线程池默认属性
3.总结
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。