`
brucewei777
  • 浏览: 83090 次
  • 性别: 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面试专题及答案.pdf

    acceptorThreadCount=”2” 使用 NIO 模型时接收线程的数目 aio(nio.2):JDK7 开始支持,异步非阻塞 IO。 apr:Tomcat 将以 JNI 的形式调用 Apache HTTP 服务器的核心动态链接库来 处理文件读取或网络传输操作,从而...

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

    在高版本的Tomcat中,默认的模式都是使用NIO模式,在Tomcat 9中,BIO模式的实现Http11Protocol甚至都已经被删除了。但是了解BIO的工作机制以及其优缺点对学习其他模式有有帮助。只有对比后,你才能知道其他模式的...

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

    在前面的文章 详解Tomcat配置文件server.xml 中写到过:Connector的主要功能,是接收连接请求,创建Request和Response对象用于和请求端交换数据;然后分配线程让Engine(也就是Servlet容器)来处理这个请求,并把...

    jsp全攻略,tomcat技术

    (表示指定service中的请求处理机,接收和处理来自Connector的请求) defaultHost 指定缺省的处理请求的主机名,它至少与其中的一个host元素的name属性值是一样的 Context (表示一个web应用程序,通常为WAR文件,关于...

    tomcat服务器的Server.xml配置详解.docx

    Connector 的主要功能,是接收连接请求,创建Request和Response对象用于和请求端交换数据;然后分配线程让Engine来处理这个请求,并把产生的Request和Response对象传给Engine。通过配置Connector,可以控制请求...

    vxworks 并发服务器程序

    * 功能描述:服务端主函数,开辟监听端口,创建接收客户端连接线程、接收客户端数据线程、客户连接超时线程 * * 参数:监听端口port * * 返回值: 成功返回0 失败返回-1 * * 作者:胡士超 * * 完成日期:2012....

    Web服务器性能测试研究

    3.2.3 多线程采集设计与实现 36 3.3 本章小结 40 第四章 Web服务器测试案例分析 41 4.1 Web服务器简介 41 4.2 测试案例 44 4.2.1 IIS服务器测试htm网站页面 44 4.2.2 IIS服务器测试asp网站页面 47 4.2.3 Tomcat...

    基于SSM架构实现的大型分布式购物网站-B2C项目源码+项目说明.zip

    方案2:在负载均衡服务器中运行一个精灵线程,预测服务器压力过大时会自动把session转移压力过小的服务器中。 3、做专门的图片服务器。使用一个http服务器,Apache.或者Nginx。使用ftp服务上传图片,vsftpd ##...

    优雅的使用 ThreadLocal

    Java的 Web项目大部分都是基于 Tomcat,每次访问都是一个新的线程,这样让我们联想到了 ThreadLocal,每一个线程都独享一个 ThreadLocal,在接收请求的时候 set特定内容,在需要的时候 get这个值。下面我们就进入...

    Java数据库编程宝典2

    16.4 使用JavaMail API接收电子邮件 16.5 小结 第4部分 数据库、JDBC和XML 第17章 XML文档对象模型和JDBC 17.1 XML与HTML 17.2 XML和文档对象模型 17.2.1 XML标题 17.2.2 标记和属性 17.2.3 元素和节点 ...

    Java数据库编程宝典4

    16.4 使用JavaMail API接收电子邮件 16.5 小结 第4部分 数据库、JDBC和XML 第17章 XML文档对象模型和JDBC 17.1 XML与HTML 17.2 XML和文档对象模型 17.2.1 XML标题 17.2.2 标记和属性 17.2.3 元素和节点 ...

    Java数据库编程宝典1

    16.4 使用JavaMail API接收电子邮件 16.5 小结 第4部分 数据库、JDBC和XML 第17章 XML文档对象模型和JDBC 17.1 XML与HTML 17.2 XML和文档对象模型 17.2.1 XML标题 17.2.2 标记和属性 17.2.3 元素和节点 ...

    Java数据库编程宝典3

    16.4 使用JavaMail API接收电子邮件 16.5 小结 第4部分 数据库、JDBC和XML 第17章 XML文档对象模型和JDBC 17.1 XML与HTML 17.2 XML和文档对象模型 17.2.1 XML标题 17.2.2 标记和属性 17.2.3 元素和节点 ...

    JAVA 范例大全 光盘 资源

    实例196 Tomcat连接池的配置 629 实例197 MySQL数据库的分页形式 633 实例198 连接ODBC数据库的Apple程序 640 第20章 JSP/Servlet技术 644 实例199 JSP与Servlet之间的跳转 644 实例200 简单的JSP多人聊天室 ...

    Java面试宝典2020修订版V1.0.1.doc

    9、java后台如何接收ajax数据? 26 10、为什么要有jquery? 26 11、jQuery选择器有多少种? 27 13、你是如何使用jquery中的ajax的? 27 14、jquery中的$.get和$.post请求区别? 27 15、jquery中如何操作样式的? 28 ...

    智能发票识别系统后台.zip

    算法端用C++编写,java后端通过多线程+socket+TCP与算法端通讯,利用对象锁完成线程调度 利用redis实现缓冲队列以及模板操作调度队列 利用spring-websocket与前端进行全双工通信 使用shiro作为安全管理框架,通过其...

    Java开发技术大全(500个源代码).

    ThreadIn.java 接收数据用的线程类 ThreadOut.java 发送数据用的线程类 TypeFile.java 显示文件内容的类 useScanner.java 用Scanner接收用户的输入 第8章 示例描述:本章学习多线程。 enhanceThread.java 一个...

    EasyJWeb服务调度和自定义邮件引擎技术的CRM系统实战开发

    通常我们会将一个完成的程序包运行在Web容器(tomcat或其他)中,容器除了要负责接受前台的请求和返回响应以外,还需要开辟大量的内存来负责数据的处理,逻辑的运算,算法的解析等。一个Web容器的内存是有限的,但是...

    Java项目开发与毕业设计指导

    bin——bin目录包含了Aglet平台所有的可执行程序,比如掌控接收Agent的后台(daemon)程序,另外bin目录还包含了进一步安装需要的文件。 cnf——cnf目录包含了Aglet平台的配置文件。 public——public目录包含了...

    java面试题

    Struts2只是起到一个数据接收和转接的功能,就是Controller控制器,而传来数据的页面叫view显示层,Struts2将数据提交给进行处理的类叫Model模型层,专门进行数据处理和数据库的连接。 heap和stack有什么区别? 答:...

Global site tag (gtag.js) - Google Analytics