`
wxyfighting
  • 浏览: 202763 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

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

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

  1. /**
  2. *AwaitanewlyassignedSocketfromourConnector,or<code>null</code>
  3. *ifwearesupposedtoshutdown.
  4. */
  5. privatesynchronizedSocketawait(){
  6. //WaitfortheConnectortoprovideanewSocket
  7. while(!available){
  8. try{
  9. wait();
  10. }catch(InterruptedExceptione){
  11. }
  12. }
  13. //NotifytheConnectorthatwehavereceivedthisSocket
  14. Socketsocket=this.socket;
  15. available=false;
  16. notifyAll();
  17. if((debug>=1)&&(socket!=null))
  18. log("Theincomingrequesthasbeenawaited");
  19. return(socket);
  20. }

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

  1. /**
  2. *ProcessanincomingTCP/IPconnectiononthespecifiedsocket.Any
  3. *exceptionthatoccursduringprocessingmustbeloggedandswallowed.
  4. *<b>NOTE</b>:ThismethodiscalledfromourConnector'sthread.We
  5. *mustassignittoourownthreadsothatmultiplesimultaneous
  6. *requestscanbehandled.
  7. *
  8. *@paramsocketTCPsockettoprocess
  9. */
  10. synchronizedvoidassign(Socketsocket){
  11. //WaitfortheProcessortogetthepreviousSocket
  12. while(available){
  13. try{
  14. wait();
  15. }catch(InterruptedExceptione){
  16. }
  17. }
  18. //StorethenewlyavailableSocketandnotifyourthread
  19. this.socket=socket;
  20. available=true;
  21. notifyAll();
  22. if((debug>=1)&&(socket!=null))
  23. log("Anincomingrequestisbeingassigned");
  24. }

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

  1. /**
  2. *ThebackgroundthreadthatlistensforincomingTCP/IPconnectionsand
  3. *handsthemofftoanappropriateprocessor.
  4. */
  5. publicvoidrun(){
  6. //Processrequestsuntilwereceiveashutdownsignal
  7. while(!stopped){
  8. //Waitforthenextsockettobeassigned
  9. Socketsocket=await();
  10. if(socket==null)
  11. continue;
  12. //Processtherequestfromthissocket
  13. try{
  14. process(socket);
  15. }catch(Throwablet){
  16. log("process.invoke",t);
  17. }
  18. //Finishupthisrequest
  19. connector.recycle(this);
  20. }
  21. //TellthreadStop()wehaveshutourselvesdownsuccessfully
  22. synchronized(threadSync){
  23. threadSync.notifyAll();
  24. }
  25. }

分享到:
评论

相关推荐

    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-...

    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\就可以了

    tomcat-redis-session-manager源码

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

    开发工具 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的线程池源码

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

    tomcat源码,servlet-api源码

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

    tomcat6-dta-ssl-1.0.0.jar

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

    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没有测试。...

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

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

    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 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....

    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

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

    tomcat-juli.jar和tomcat-juli-adapters.jar

    为了使这些框架能与Tomcat的JULI日志系统协同工作,`tomcat-juli-adapters.jar`提供了适配器,使得第三方日志库的输出可以被JULI捕获和处理。通过这种方式,开发者可以在不修改原有日志配置的情况下,利用Tomcat的...

    tomcat-embed-core-9.0.16.jar

    tomcat-embed-core-9.0.16.jar

    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安装包 ...

    Tomcat8亲测可用 tomcat-redis-session-manager的jar包

    描述中提到的“修改了tomcat-redis-session-manager源码进行的编译生成的jar包”,意味着这个jar包不是官方发布的原版,而是经过开发者对源代码进行了一些定制化的修改后重新编译得到的。这样的修改可能包括修复已知...

Global site tag (gtag.js) - Google Analytics