`
brucewei777
  • 浏览: 84804 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Tomcat的接收线程们

    博客分类:
  • java
 
阅读更多
在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处理的4篇资料

    在这个主题中,我们将深入探讨"Tomcat中多线程对于Servlet处理"的相关知识点,特别关注在5.5.17版本中的实现。 1. **Tomcat的线程模型** Tomcat使用了一个基于Apache Commons Daemon的JVM服务模型,其中包含了...

    模拟tomcat的工作原理

    1. **连接器(Connector)组件**:这是Tomcat接收HTTP请求的第一道关卡。它监听特定的端口(默认8080),接收来自客户端的HTTP连接。在模拟中,我们需要创建一个线程池来管理这些连接,确保高并发情况下能有效地处理...

    从连接器组件看Tomcat的线程模型——BIO模式(推荐)

    【Tomcat线程模型——BIO模式】 在深入理解Tomcat的线程模型之前,我们需要先明白什么是BIO( Blocking I/O,阻塞I/O)。BIO是一种传统的I/O处理方式,当一个线程处理一个连接时,如果该连接处于等待数据的状态,...

    tomcat 分配请求之——socket获取请求

    对于每个接收到的请求,Tomcat会从线程池中取出一个空闲线程来处理。线程会读取Socket中的剩余数据,解析请求,执行相应的Servlet或JSP,然后将结果写回Socket,最后关闭Socket连接。在这个过程中,线程池管理着线程...

    tomcat6的源码

    1. **Servlet容器**:Tomcat作为Servlet容器,其主要任务是管理和运行Servlet,接收HTTP请求,并将响应返回给客户端。在源码中,你可以看到如何处理这些请求和响应的实现。 2. **线程模型**:Tomcat使用了多线程...

    Tomcat深入剖析pdf+源码(Tomcat运行原理)

    6. **连接器与管道**:Coyote连接器负责接收和发送网络数据,管道(Pipeline)则提供了灵活的处理链,允许自定义处理器(Valve)来扩展Tomcat的功能。 7. **部署与热部署**:Tomcat支持自动部署和热部署,只需将WAR...

    Tomcat 接口文档 API

    3. **Connector**: 连接器组件是Tomcat接收和处理HTTP请求的部分。Tomcat通常有多个连接器,每个连接器可以配置不同的端口、协议和线程池。通过修改Connector的配置,可以优化服务器性能,例如设置最大连接数、超时...

    tomcat7源码下载

    三、Tomcat7的线程模型 Tomcat采用NIO(非阻塞I/O)或BIO(阻塞I/O)模型,Coyote连接器负责这部分实现。NIO模型在高并发环境下表现出色,因为它可以处理大量并发连接,而无需为每个连接创建新线程。 四、Tomcat7...

    how tomcat work_中文版(源码)

    1. **接收请求**:当客户端(浏览器)发送HTTP请求到服务器时,Tomcat的Acceptor线程会捕获这个连接,将其放入一个工作线程池等待处理。 2. **解析请求**:工作线程接收到请求后,会解析请求头和请求体,识别出HTTP...

    tomcat源码

    Tomcat采用基于线程的模型来处理请求,每个请求都会分配一个工作线程来执行。在`server.xml`配置文件中,可以通过`Executor`元素自定义线程池,以优化性能。 5. **JSP编译与执行** Jasper组件将JSP文件编译为Java...

    Tomcat中间件监控配置&指标.doc

    5. JK连接信息:包括最大线程数、最小备用线程数、最大备用线程数、当前线程总数、当前繁忙线程数、最大处理时间、实际处理时间、请求总数、错误总数、接收字节数和发送字节数等信息。 6. WEB应用信息:包括应用...

    Android客户端上传数据到tomcat服务端的源码

    总之,Android客户端上传数据到Tomcat服务器涉及了网络编程、文件操作、多线程、数据序列化等多个方面,理解并熟练掌握这些知识点对于开发高效、安全的应用至关重要。在实际开发中,还需要考虑各种边界情况和性能...

    tomcat压缩包

    7. **线程池**:Tomcat使用Executor线程池管理请求处理线程,通过调整线程池参数可以优化服务器的并发性能。 8. **日志系统**:Tomcat内置了日志系统,通过配置`logging.properties`文件,可以定制日志输出,便于...

    基于tomcat的连接数与线程池详解

    Tomcat连接器(Connector)是Apache Tomcat服务器的核心组件之一,负责接收客户端的连接请求,创建请求对象,将请求分派给处理请求的Servlet容器,并最终返回响应。在Tomcat的配置和性能优化中,了解如何设置连接数...

    Tomcat线程池实现简介

    总结来说,Tomcat的线程池设计体现了高效的多线程管理策略,通过预创建和复用线程,以及合理的线程创建和销毁策略,确保了在高并发场景下的高性能和稳定性。理解并掌握这一机制,对于优化Java Web应用的性能有着重要...

    how tomcat work

    为了提升性能,Tomcat允许调整各种参数,如最大线程数、连接超时、缓冲区大小等。此外,还可以通过配置缓存、使用NIO连接器等方式优化性能。 通过阅读《深度剖析Tomcat》中文版和源码,可以更深入地理解Tomcat的...

    apache-TOMCAT-5.5.25

    3. ** Coyote**:处理HTTP连接,是Tomcat接收和响应HTTP请求的组件。 4. **Juli**:这是Tomcat的日志系统,可以自定义日志输出格式和级别。 5. **Shared**:共享库,可以被所有Web应用程序使用。 在Apache Tomcat...

    tomcat并发资料

    3. **连接器(Connector)组件**:Tomcat有多种连接器实现,如HTTP/1.1的`AprLifecycleListener`和NIO/NIO2等,它们决定了Tomcat如何接收和处理网络连接,对并发性能有直接影响。 4. **线程上下文类加载器**:...

    How Tomcat Works 中文版

    Tomcat5的后台处理线程是共享的,相比于Tomcat4中每个组件都有自己的处理线程,Tomcat5能更高效地利用资源。此外,Tomcat5在代码上简化了映射组件的使用。 这本书共分为20章,其中前两章作为引言,为读者提供预备...

Global site tag (gtag.js) - Google Analytics