tomcat线程模型分析

tomcat线程模型源码初体验

常用的web服务器肯定不止tomcat,还有weblogic,jetty等,但是到目前为止,只用过tomcat服务器。简单总结一下收获。

tomcat支持四种线程模型

  • BIO
    同步阻塞式IO,就是传统的java.io,该模式下每个请求都会创建一个线程,性能开销大,不适合高并发场景,但是稳点,适合连接数目小且固定的架构。
  • NIO
    同步非阻塞IO(jdk1.4后),该模式基于多路复用选择器(selector)监测连接状态再通知线程处理,从而达到非阻塞的目的,能更好的支持并发,tomcat8.0之后默认采用。
  • APR
    全称是apache protable runtime,以jni的形式调用Apache HTTP服务器的核心动态链接库,需要安装APR库。(具体我也没用过)
  • AIO
    异步非阻塞式IO,jdk1.7后之支持,不需要多路复用选择器,而是通过请求处理线程执行完后,回调通知继续执行后续操作。tomcat8.0后支持。

在tomcat中配置线程模型
在tomcat->conf中找到server.xml,打开找到下面配置。

这里默认就是BIO,BIO还有一种写法就是:protocol=“org.apache.coyote.http11.Http11Protocol“
NIO
protocol=”org.apache.coyote.http11.Http11NioProtocol“
AIO
protocol=”org.apache.coyote.http11.Http11Nio2Protocol“
APR
protocol=”org.apache.coyote.http11.Http11AprProtocol“

tomcat中BIO源码分析
大致流程如下:

入口就是JioEndPoint这个类(因为早期就只有BIO,所以这里命名就是javaIo),这个类里面有个内部类Acceptor,有客户端请求时首先就会到这里,在这里插入图片描述
这里的countUporAwaitConnection()方法是统计tomcat的连接数,默认设置的是10000,如果超过了这个数,就会把请求放到阻塞队列中。在这里插入图片描述
这里的acceptSocket就是调用了ServerSocket的accept方法。到这,客户端和服务器就建立了连接。

在这里插入图片描述
下面的processSocket就是具体处理连接了,
在这里插入图片描述
getExecutor就是从线程池中取线程去执行这个socket
处理就是在SocketProcessor这个类中,这个类实现了runnable接口,run方法中就是根据socket状态处理在这里插入图片描述

tomcat中NIO源码分析
主要流程:
在这里插入图片描述
在这里插入图片描述
从这里面可以看出,tomcat切换成nio后,有三类线程,acceptor,poller,socketProcessor。
在这里插入图片描述
这里就是NioEndpoint了,可以看出开始和bio区别不大,主要就是serverSock.accpet,只是这个地方就是SocketChannel了,serverSocket就是ServerSocketChannel,下面看看初始化
在这里插入图片描述
得到socket后,就是把它封装成一个管道,然后注册到poller中,在这里插入图片描述
这里的socket.getSelector就是得到多路复用器,把管道注册到selector中
在这里插入图片描述
注册后,selector就开始轮循,1秒钟会轮循一次
在这里插入图片描述
获取需要处理的channel进行处理,processKey就是具体的处理
在这里插入图片描述

到这就分析结束了,分析的不够细致,上面仅是个人理解。

发布了42 篇原创文章 · 获赞 29 · 访问量 2556

猜你喜欢

转载自blog.csdn.net/qq_32314335/article/details/85224793
今日推荐