您的位置:首页 > 运维架构 > Tomcat

tomcat对线程池的扩展

2015-11-24 23:33 441 查看
为了减少线程创建和销毁的消耗,通常会使用线程池,在JDK中,默认集成了高效的几种线程池:在tomcat中的线程池并没有自定义实现,而是利用了JDK的线程池,继承了上述的特性,并基于自己的逻辑进行了扩展;

1、JDK线程配置属性初始化

tomcat的配置文件中,配置<Service>标签中的<Executor>属性:

这个Executor,在tomcat各种书籍中叫做执行器,它的实际的作用就是线程池,对于Connector如何与这个Executor进行关连的,它是通过<Connector>元素中的executor属性指向你所配置的<Executor>元素的;对于这个配置,Executor元素对应的是org.apache.catalina.Executor接口,Tomcat中的标准实现是

org.apache.catalina.core.StandardThreadExecutor;

tomcat的配置管理会通过digest解析这个配置文件,然后将你所填写的属性初始化到这个StandardThreadExecutor类中;但是StandardThreadExecutor类并不是具体对应的线程池的实现,它仅仅起到的是tomcat线程池的初始化和销毁的工作,上述的工作依托于tomcat自身独有的lifecycle接口:

在组件启动的时候,初始化ThreadPoolExecutor线程池,在组件关闭的时候,销毁ThreadPoolExecutor线程池;之所以这么做,是因为tomcat的StandardXXX的各种组件,仅仅是Standard引擎的实现,tomcat可以允许你对整个内部实现进行替换;

注意上述的ThreadPoolExecutor线程池,这还不是JDK的线程池,仅仅与其同名而已,它的真正实现是org.apache.tomcat.util.threads.ThreadPoolExecutor;这个类就是tomcat的线程池,它继承于JDK的ThreadExecutor,对其进行了扩展;

上述的流程是配置了默认的<Executor>元素;而如果不配置的话,对应的Connector会创建一个默认的线程池:

2、线程ThreadLocal泄露清理

tomcat的ThreadExecutor其中一个重要的作用,就是对线程的ThreadLocal缓存的变量进行清理;

为什么ThreadLocal要进行清理呢?如果是一个简单的main函数的话,那么在这个主线程中使用ThreadLocal缓存在程序结束之后,自动就随着JVM退出而消亡了;如果是开启的一个线程,这个线程中使用了ThreadLocal缓存,线程退出,这种情况这块内存仍旧会进行回收;但是,线程池的线程是重复利用的,很有可能会在某处使用了ThreadLocal缓存,但是忘记remove掉了,这种在线程池中是很致命的;

即使,tomcat这种服务器程序非常严谨,但是tomcat也为了以防万一,做了一个预防措施:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: