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也为了以防万一,做了一个预防措施:
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也为了以防万一,做了一个预防措施:
相关文章推荐
- dubbo-admin-2.5.4在tomcat中部署失败的问题
- finereport的服务器负载均衡部署--tomcat
- tomcat 配置文件server.xml详解
- tomcat 多实例部署
- Tomcat
- tomcat线程池调优
- IDEA tomcat内存溢出
- 为tomcat 创建定时 任务 关闭 重启
- tomcat内部运行原理浅析--转载
- Tomcat日志配置
- Tomcat 的三种(bio,nio.apr) 高级 Connector 运行模式
- Tomcat 生产服务器性能优化
- linux下安装jdk和tomcat
- tomcat性能调优
- spring4+tomcat8+jdk8应用websocket
- TOMCAT 7优化前及优化后的性能对比
- Tomcat启动报Error listenerStart错误
- tomcat执行startup报错!
- apr-tomcat-native安装
- tomcat中仅启动指定的项目,不启动其它项目