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

Tomcat源码分析(三)------ 可携带状态的线程池 (转)

阅读更多
最近想实现一个可携带状态的线程池,具体需求就是池中的线程被用来处理某种信息,而此信息可视为线程所依赖的外部状态。如果用简单的线程池来实现,线程初始化时就得赋予某些信息,使得线程无法被再次利用。在看老版Tomcat的源码时,找到了答案,其实现思路主要是利用了线程的等待和唤起,HttpProcessor的实现正好基于此思路,时序图如下所示:



初始化HttpProcessor线程时,没法赋予所需的Socket对象,因为如果在初始化阶段就赋予Socket会导致此线程没法回收用来处理其他Socket。因此,在HttpProcessor的run阶段,先把线程给wait住,具体在await方法里体现,代码如下所示:

/** 
* Await a newly assigned Socket from our Connector, or <code>null</code> 
* if we are supposed to shut down. 
*/ 
private synchronized Socket 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  
    Socket socket = this.socket;  
    available = false;  
    notifyAll();  
 
    if ((debug >= 1) && (socket != null))  
        log("  The incoming request has been awaited");  
 
    return (socket);  
 

/**
* Await a newly assigned Socket from our Connector, or <code>null</code>
* if we are supposed to shut down.
*/
private synchronized Socket 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
    Socket socket = this.socket;
    available = false;
    notifyAll();

    if ((debug >= 1) && (socket != null))
        log("  The incoming request has been awaited");

    return (socket);

}

当HttpConnector调用HttpProcessor.assign(socket)方法时,会给此线程赋予Socket对象,并唤起此线程,使其继续执行,assign方法的源码如下所示:

/** 
* Process an incoming TCP/IP connection on the specified socket.  Any 
* exception that occurs during processing must be logged and swallowed. 
* <b>NOTE</b>:  This method is called from our Connector's thread.  We 
* must assign it to our own thread so that multiple simultaneous 
* requests can be handled. 

* @param socket TCP socket to process 
*/ 
synchronized void assign(Socket socket) {  
 
    // 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;  
    available = true;  
    notifyAll();  
 
    if ((debug >= 1) && (socket != null))  
        log(" An incoming request is being assigned");  
 

/**
* Process an incoming TCP/IP connection on the specified socket.  Any
* exception that occurs during processing must be logged and swallowed.
* <b>NOTE</b>:  This method is called from our Connector's thread.  We
* must assign it to our own thread so that multiple simultaneous
* requests can be handled.
*
* @param socket TCP socket to process
*/
synchronized void assign(Socket socket) {

    // 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;
    available = true;
    notifyAll();

    if ((debug >= 1) && (socket != null))
        log(" An incoming request is being assigned");

}

线程被唤起和赋予socket对象后,继续执行核心的process方法,HttpProcessor.run的完整源码如下所示:

/** 
* 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 (!stopped) {  
 
        // Wait for the next socket to be assigned  
        Socket socket = await();  
        if (socket == null)  
            continue;  
 
        // Process the request from this socket  
        try {  
            process(socket);  
        } catch (Throwable t) {  
            log("process.invoke", t);  
        }  
 
        // Finish up this request  
        connector.recycle(this);  
 
    }  
 
    // Tell threadStop() we have shut ourselves down successfully  
    synchronized (threadSync) {  
        threadSync.notifyAll();  
    }  
 




本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/cutesource/archive/2009/12/26/5081916.aspx
分享到:
评论

相关推荐

    tomcat-redis-session-manager-1.2-tomcat-7-java-7

    tomcat-redis-session-manager-1.2-tomcat-7-java-7tomcat-redis-session-manager-1.2-tomcat-7-java-7tomcat-redis-session-manager-1.2-tomcat-7-java-7tomcat-redis-session-manager-1.2-tomcat-7-java-7tomcat-...

    Maven使用tomcat8-maven-plugin插件.docx

    Maven 使用 tomcat8-maven-plugin 插件 Maven 是一个流行的构建自动化工具,它可以帮助开发者自动完成项目的编译、测试、打包、部署等任务。 Tomcat 是一个流行的 Web 服务器,Maven 提供了一个插件 tomcat8-maven-...

    TOMCAT的线程池源码

    总结来说,Tomcat的线程池源码设计精巧,兼顾了性能与可管理性。通过深入学习和理解这部分源码,开发者不仅可以掌握线程池的工作原理,还能更好地优化自己的Web应用,提升服务的并发处理能力和稳定性。对于希望提升...

    tomcat-redis-session-manager源码

    《深入解析Tomcat-Redis-Session-Manager源码》 在现代Web应用中,服务器端会话管理是一个至关重要的部分,特别是在高并发、分布式环境中。Tomcat作为最流行的Java Servlet容器,提供了丰富的功能来支持这一需求。...

    tomcat9+tomcat-cluster-redis-session-manager_4.0.zip

    "tomcat9+tomcat-cluster-redis-session-manager_4.0.zip"这个文件组合涉及到的是在Tomcat 9上实现负载均衡以及使用Redis作为Session管理器的高级配置。 首先,Tomcat 9是Apache Tomcat服务器的一个版本,它是Java ...

    tomcat8-maven-plugin-3.0-r1655215.jar

    解决tomcat8-maven-plugin-3.0-r1655215.jar阿里云同有的问题。放到路径org\apache\tomcat\maven\tomcat8-maven-plugin\3.0-r1655215\就可以了

    开发工具 apache-tomcat-8.0.41-windows-x86

    开发工具 apache-tomcat-8.0.41-windows-x86开发工具 apache-tomcat-8.0.41-windows-x86开发工具 apache-tomcat-8.0.41-windows-x86开发工具 apache-tomcat-8.0.41-windows-x86开发工具 apache-tomcat-8.0.41-...

    tomcat源码,servlet-api源码

    当客户端请求携带会话ID时,Tomcat根据ID查找并恢复会话状态。此外,Tomcat还支持会话超时、分布式会话和会话持久化等高级功能。 5. **安全性与权限控制** Tomcat使用Realm组件进行身份验证,如MemoryRealm、...

    tomcat-redis-session-manager的jar包-包含Tomcat7和Tomcat8

    《深入理解Tomcat-Redis-Session-Manager:在Tomcat7和Tomcat8中的应用》 在现代Web应用程序开发中,session管理是一个至关重要的环节,它涉及到用户会话的持久化和跨请求的数据共享。传统的session管理方式在高...

    tomcat8.5.20-redis-session共享-JAR包大全

    apache-tomcat-8.5.20.tar.gz源码包和context.xml文件,这套配置是我自己亲测可用的。。另外我用的redis4这个版本。注意:如果你使用的TOMCAT其他版本。例如tomcat6或者7这套JAR包可能不可用,tomcat8.0没有测试。...

    tomcat6-dta-ssl-1.0.0.jar

    tomcat6-dta-ssl-1.0.0.jar 此类文件将有助于tomcat支持ssl协议

    apache-tomcat-9.0.45-windows-x64

    apache-tomcat-9.0.45-windows-x64apache-tomcat-9.0.45-windows-x64apache-tomcat-9.0.45-windows-x64apache-tomcat-9.0.45-windows-x64apache-tomcat-9.0.45-windows-x64apache-tomcat-9.0.45-windows-x64apache-...

    tomcat-redis-session-manager包集合下载(tomcat8)

    【标题】"tomcat-redis-session-manager包集合下载(tomcat8)"涉及的主要知识点是将Redis集成到Tomcat中管理会话(session),以提高Web应用的性能和可扩展性。 【描述】中提到的"所需的tomcat-redis-session-...

    tomcat-redis-session-manager for tomcat8.5

    压缩文件包括tomcat-redis-session-manager-master-2.0.0.jar、jedis-2.7.3.jar、commons-pool2-2.3.jar三个jar包使用方法请参照https://github.com/jcoleman/tomcat-redis-session-manager。apache-tomcat-8.5.33....

    apache-tomcat-8.5.78-windows-x64安装包-kaic.rar

    apache-tomcat-8.5.78-windows-x64安装包 apache-tomcat-8.5.78-windows-x64安装包 apache-tomcat-8.5.78-windows-x64安装包 apache-tomcat-8.5.78-windows-x64安装包 apache-tomcat-8.5.78-windows-x64安装包 ...

    tomcat共享session tomcat-redis-session-manager-2.0.0.jar包下载

    tomcat-redis-session-manager-2.0.0.jar包,不用自己打包了,tomcat共享session到redis中,解决分布式应用的状态问题。

    tomcat-redis-session-manager-1.2-tomcat-6.jar

    用于配置 tomcat-redis-session-manager

    TOMCAT 跨域 CORS Access-Control-Allow-Origin cors-filter

    `cors-filter`是一个第三方过滤器,用于在Tomcat服务器上实现CORS策略。它会在请求处理前拦截请求,检查其是否符合CORS规则,并添加必要的响应头。`java-property-utils`库则是用来处理Java属性文件的工具,可能在这...

    tomcat-redis-session-manager

    在Web应用开发中,session管理是不可或缺的一部分,它用于存储用户状态信息,确保用户在不同页面间保持登录状态。然而,随着分布式系统的普及,单个服务器的session管理已无法满足需求。这时,我们需要将session数据...

    tomcat-connectors-1.2.40-windows-x86_64-httpd-2.4.x

    标题中的"tomcat-connectors-1.2.40-windows-x86_64-httpd-2.4.x"指的是Tomcat服务器与Apache HTTPD服务器之间的连接器版本1.2.40,专为64位Windows系统设计,并且兼容HTTPD服务器的2.4.x版本。这个连接器,也被称为...

Global site tag (gtag.js) - Google Analytics