在connector部分,有个类叫AprEndpoint,在org.apache.tomcat.util.net中。该类有如下功能:
1. 获得客户端的socket
2. 将获得的socket交给该类线程池(是由一个栈实现的)中的闲置线程
3. 各线程调用AprEndpoint中的handler变量对socket进行处理(process()函数)
注:handler是AjpConnectionHandler或者Http11ConnectionHandler的实例。
看这个之前,我是有几个问题不太确定,所以看了一下源代码,什么问题呢?
tomcat的socket是非阻塞式工作吗?
多线程处理请求到底是在哪个环节开始的呢?
看了之后,发现,tomcat的socket居然是阻塞式的
long socket = Socket.accept(serverSock);
// 从线程池中取出闲置线程来处理收到的socket
getWorkerThread().assign(socket, true);
该线程类叫Worker,用了assign和await两个函数来实现生产者和消费者模型,个人觉得有点多余。通过getWorkerThread()拿到的一定是闲置线程,还搞什么同步呢?
protected class Worker implements Runnable {
protected Thread thread = null;
protected boolean available = false;
protected long socket = 0;
protected boolean options = false;
protected synchronized void assign(long socket, boolean options) {
// Wait for the Processor to get the previous Socket
while (available) {
try {
wait();
} catch (InterruptedException e) {
}
}
// Store the newly available Socket and notify our thread
this.socket = socket;
this.options = options;
available = true;
notifyAll();
}
/**
* Await a newly assigned Socket from our Connector, or <code>null</code>
* if we are supposed to shut down.
*/
protected synchronized long await() {
// Wait for the Connector to provide a new Socket
while (!available) {
try {
wait();
} catch (InterruptedException e) {
}
}
// Notify the Connector that we have received this Socket
long socket = this.socket;
available = false;
notifyAll();
return (socket);
}
/**
* The background thread that listens for incoming TCP/IP connections and
* hands them off to an appropriate processor.
*/
public void run() {
// Process requests until we receive a shutdown signal
while (running) {
// Wait for the next socket to be assigned
long socket = await();
if (socket == 0)
continue;
// Process the request from this socket
if ((options && !setSocketOptions(socket)) || !handler.process(socket)) {
// Close socket and pool
Socket.destroy(socket);
socket = 0;
}
// Finish up this request
recycleWorkerThread(this);
}
}
/**
* Start the background processing thread.
*/
public void start() {
thread = new ThreadWithAttributes(AprEndpoint.this, this);
thread.setName(getName() + "-" + (++curThreads));
thread.setDaemon(true);
thread.start();
}
}
分享到:
相关推荐
在这个主题中,我们将深入探讨"Tomcat中多线程对于Servlet处理"的相关知识点,特别关注在5.5.17版本中的实现。 1. **Tomcat的线程模型** Tomcat使用了一个基于Apache Commons Daemon的JVM服务模型,其中包含了...
1. **连接器(Connector)组件**:这是Tomcat接收HTTP请求的第一道关卡。它监听特定的端口(默认8080),接收来自客户端的HTTP连接。在模拟中,我们需要创建一个线程池来管理这些连接,确保高并发情况下能有效地处理...
【Tomcat线程模型——BIO模式】 在深入理解Tomcat的线程模型之前,我们需要先明白什么是BIO( Blocking I/O,阻塞I/O)。BIO是一种传统的I/O处理方式,当一个线程处理一个连接时,如果该连接处于等待数据的状态,...
对于每个接收到的请求,Tomcat会从线程池中取出一个空闲线程来处理。线程会读取Socket中的剩余数据,解析请求,执行相应的Servlet或JSP,然后将结果写回Socket,最后关闭Socket连接。在这个过程中,线程池管理着线程...
1. **Servlet容器**:Tomcat作为Servlet容器,其主要任务是管理和运行Servlet,接收HTTP请求,并将响应返回给客户端。在源码中,你可以看到如何处理这些请求和响应的实现。 2. **线程模型**:Tomcat使用了多线程...
6. **连接器与管道**:Coyote连接器负责接收和发送网络数据,管道(Pipeline)则提供了灵活的处理链,允许自定义处理器(Valve)来扩展Tomcat的功能。 7. **部署与热部署**:Tomcat支持自动部署和热部署,只需将WAR...
3. **Connector**: 连接器组件是Tomcat接收和处理HTTP请求的部分。Tomcat通常有多个连接器,每个连接器可以配置不同的端口、协议和线程池。通过修改Connector的配置,可以优化服务器性能,例如设置最大连接数、超时...
三、Tomcat7的线程模型 Tomcat采用NIO(非阻塞I/O)或BIO(阻塞I/O)模型,Coyote连接器负责这部分实现。NIO模型在高并发环境下表现出色,因为它可以处理大量并发连接,而无需为每个连接创建新线程。 四、Tomcat7...
1. **接收请求**:当客户端(浏览器)发送HTTP请求到服务器时,Tomcat的Acceptor线程会捕获这个连接,将其放入一个工作线程池等待处理。 2. **解析请求**:工作线程接收到请求后,会解析请求头和请求体,识别出HTTP...
Tomcat采用基于线程的模型来处理请求,每个请求都会分配一个工作线程来执行。在`server.xml`配置文件中,可以通过`Executor`元素自定义线程池,以优化性能。 5. **JSP编译与执行** Jasper组件将JSP文件编译为Java...
5. JK连接信息:包括最大线程数、最小备用线程数、最大备用线程数、当前线程总数、当前繁忙线程数、最大处理时间、实际处理时间、请求总数、错误总数、接收字节数和发送字节数等信息。 6. WEB应用信息:包括应用...
总之,Android客户端上传数据到Tomcat服务器涉及了网络编程、文件操作、多线程、数据序列化等多个方面,理解并熟练掌握这些知识点对于开发高效、安全的应用至关重要。在实际开发中,还需要考虑各种边界情况和性能...
7. **线程池**:Tomcat使用Executor线程池管理请求处理线程,通过调整线程池参数可以优化服务器的并发性能。 8. **日志系统**:Tomcat内置了日志系统,通过配置`logging.properties`文件,可以定制日志输出,便于...
Tomcat连接器(Connector)是Apache Tomcat服务器的核心组件之一,负责接收客户端的连接请求,创建请求对象,将请求分派给处理请求的Servlet容器,并最终返回响应。在Tomcat的配置和性能优化中,了解如何设置连接数...
总结来说,Tomcat的线程池设计体现了高效的多线程管理策略,通过预创建和复用线程,以及合理的线程创建和销毁策略,确保了在高并发场景下的高性能和稳定性。理解并掌握这一机制,对于优化Java Web应用的性能有着重要...
为了提升性能,Tomcat允许调整各种参数,如最大线程数、连接超时、缓冲区大小等。此外,还可以通过配置缓存、使用NIO连接器等方式优化性能。 通过阅读《深度剖析Tomcat》中文版和源码,可以更深入地理解Tomcat的...
3. ** Coyote**:处理HTTP连接,是Tomcat接收和响应HTTP请求的组件。 4. **Juli**:这是Tomcat的日志系统,可以自定义日志输出格式和级别。 5. **Shared**:共享库,可以被所有Web应用程序使用。 在Apache Tomcat...
3. **连接器(Connector)组件**:Tomcat有多种连接器实现,如HTTP/1.1的`AprLifecycleListener`和NIO/NIO2等,它们决定了Tomcat如何接收和处理网络连接,对并发性能有直接影响。 4. **线程上下文类加载器**:...
Tomcat5的后台处理线程是共享的,相比于Tomcat4中每个组件都有自己的处理线程,Tomcat5能更高效地利用资源。此外,Tomcat5在代码上简化了映射组件的使用。 这本书共分为20章,其中前两章作为引言,为读者提供预备...