Tomcat中的connector负责将从客户端发出的请求封装成Request对象,再交由processor进行处理。
为了提高性能,connector内部实现了一个简单的多例模式来获取processor,在启动阶段,会有一定数量的processor提前被产生并保留在内存中,当需要时直接从内存中取。如果当前所有processor都被占用,则会继续产生新的processor并丢进内存缓存。
/**
* The current number of processors that have been created.
*/
private int curProcessors = 0;
/**
* The minimum number of processors to start at initialization time.
*/
protected int minProcessors = 5;
/**
* The maximum number of processors allowed, or <0 for unlimited.
*/
private int maxProcessors = 20;
/**
* The set of processors that have been created but are not currently
* being used to process a request.
*/
private Stack<HttpProcessor> processors = new Stack<HttpProcessor>();
/**
* Get Processor from stack if there still exist, or create new one
* if current processor number didn't more than max number.
* Otherwise, null will be returned.
*
* @return instance of HttpProcessor
*/
protected HttpProcessor getProcessor() {
synchronized (processors) {
if (processors.size() > 0) {
return processors.pop();
}
if ((maxProcessors > 0) && (curProcessors < maxProcessors)) {
return (newProcessor());
} else {
if (maxProcessors < 0) {
return (newProcessor());
} else {
return (null);
}
}
}
}
private HttpProcessor newProcessor() {
HttpProcessor processor = new HttpProcessor(this);
processor.start();
curProcessors++;
return processor;
}
public void recycle(HttpProcessor processor) {
processors.push(processor);
}
由于processor本身并不消耗资源,因此如此创建方式对性能并没有多大的提升。重点是对于每个processor实例,Tomcat将启动一个新的线程来处理socket,以此来或多更大的吞吐量。
以下是Tomcat如何启动多线程的processor并不断监听状态变化的方案。
HttpProcessor继承Runable接口,每当我们调用其start()方法时,都会启动一个新的线程:
public void start() {
Thread thread = new Thread(this);
thread.setDaemon(true);
thread.start();
}
public void run() {
while (!stopped) {
Socket socket = await();
if (socket == null) {
continue;
}
process(socket);
connector.recycle(this);
}
}
private synchronized Socket await() {
while (!available) {
try {
wait();
} catch (InterruptedException e) {
// Do nothing.
}
}
Socket socket = this.socket;
available = false;
notifyAll();
return socket;
}
当processor新线程启动时,它做了这样一系列的事情:
1. 等待其他线程通知,当某个通知到来时,验证available是否为false,如果为true,继续等待,否则进入第二步。
2. 获取实例变量socket的值,
3. 将available改成false。
4. 通知其他线程状态改变。
5. 对socket进行相应处理(process方法)。
6. connector资源回收该对象。
而在connector主线程中,是通过这种方式调用processor的:
HttpProcessor processor = getProcessor();
processor.assign(socket);
processor的assign方法如下:
/**
* The entry point of HttpProcessor. Assign an socket to the processor, it
* will start a new thread.
*
*
* @param socket
*/
public synchronized void assign(Socket socket) {
while(available) {
try {
wait();
} catch (InterruptedException e) {
// Do nothing.
}
}
this.socket = socket;
available = true;
notifyAll();
}
这个方法首先监听其他线程通知,一旦获得available为false了,便将socket值设置为新的值,并将available值改为true,最后通知其他线程。
assign方法和run方法运行在两个不同的线程中: connector主线程以及processor子线程。当主线程获得一个新的socket,就会assign给processor对象,并通知processor子线程。一旦通知完毕,主线程就返回继续监听其它socket。 而processor子线程收到通知后会对被assign的socket进行相应的处理。
通过这种方式,线程之间各司其职,获得了最大的性能提升。
分享到:
相关推荐
详细讲解了Tomcat6.0共享线程池配置和性能调优的方法
下面小编就为大家带来一篇基于tomcat的连接数与线程池详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
TOMCAT的线程池源码封装,有想学习TOMCAT的线程池源,或者觉得JDK的线程池源码效率不高,可以下载此代码
Tomcat是使用最广的Java Web容器,功能强大,可扩展性强
够基础、够循序渐进,加上作者本身对tomcat的深入理解,所以行文中处处向读者传递着tomcat的设计思想,我想这才是大部分人研究tomcat所希望学到的
tomcat5.5中文手册tomcat5.5中文手册tomcat5.5中文手册tomcat5.5中文手册tomcat5.5中文手册tomcat5.5中文手册tomcat5.5中文手册tomcat5.5中文手册tomcat5.5中文手册tomcat5.5中文手册tomcat5.5中文手册tomcat5.5中文...
检测Tomcat运行状态-自动重启
tomcat中文帮助文档 tomcat中文帮助文档 tomcat中文帮助文档 tomcat中文帮助文档
当tomcat服务假死或异常停止,可以快速实现自动重启
解决tomcat中文乱码问题,有详细的解释说明,希望对需要的人有所帮助
springboot线程池使用的一个demo,注解开发,很简单,下载即用
10秒检测tomcat网站是否访问正常,访问异常30秒内完成tomcat重启并继续监控,傻瓜式修改两个地方,第一个要监控的 url地址支持https,第二个是tomcat的安装目录,就可以了。好用记得给个大大的好评。bat文件每一行都...
解决tomcat中文乱码的问题!!!!!! !!!!!!!!!!!!!!!!!!!
apache-tomcat-8.5配置优化后,配置好了,tomcat用户名密码,可直接使用admin
内含tomcat7 tomcat8 tomcat9免安装版本;供需要的人下载。
包含tomcat7,tomcat8,tomcat9,解压、在eclipse配置好即可。
监测Tomcat状态 语言java.用语监控自己的web网站状态
简介- 关于Apache Tomcat的 简短,高层位概貌。 安装 - 怎样在一系列不同的平台上 安装和运行Apache Tomcat 。 简单网络应用- 简单 介绍Servlet 2.3 规则里制定的关于网络应用的概念。覆盖面包括基本的网络应用 的...
tomcat最新客户端tomcat最新客户端tomcat最新客户端tomcat最新客户端tomcat最新客户端tomcat最新客户端tomcat最新客户端tomcat最新客户端tomcat最新客户端tomcat最新客户端tomcat最新客户端tomcat最新客户端tomcat...