从连接器组件看Tomcat的线程模型-NIO模式

本文详细介绍了Tomcat在NIO模式下的工作原理,从NioEndpoint的bind和startInternal方法分析了初始化过程,强调了Acceptor线程的角色,解释了它如何接收客户端请求并在连接数达到最大值时的行为。同时,文章讨论了Poller组件如何轮询检查事件并处理通道,以及SocketProcessor如何定义任务。整个流程展示了Tomcat如何高效地处理并发连接,重点讨论了连接数控制、非阻塞I/O和事件驱动的特性。
摘要由CSDN通过智能技术生成

Tomcat8之后,针对Http协议默认使用org.apache.coyote.http11.Http11NioProtocol,也就是NIO模式。通过之前的博客分析,我们知道Connector组件在初始化和start的时候会触发它子组件(Http11NioProtocol、NIOEndpoint的初始化和start)。
NIO模式工作时序图#

还是像之前那样,我们先整理出NIO模式启动时的时序图。

从上面的时序图可以看出,整个流程的重点时在NioEndpoint这个类中。下面我们通过源代码看下这几个重点方法。

Copy
//NIO模式绑定端口
public void bind() throws Exception {
//初始化套接字服务,需要注意的是在NIO模式下,这个ServerSocketChannel还是阻塞模式的
initServerSocket();
//设置默认的acceptor线程数,默认是1个,这个参数暂时好像没法修改(??)
//注意这个参数和acceptCount(接收请求连接的数量)之间的区别
if (acceptorThreadCount == 0) {
acceptorThreadCount = 1;
}
//设置pollerThreadCount,根据CPU的核数来,CPU大于2个设置为2,否则为1
if (pollerThreadCount <= 0)
pollerThreadCount = 1;
}
//设置CountDownLatch
setStopLatch(new CountDownLatch(pollerThreadCount));
initialiseSsl();
selectorPool.open();
}

这个代码主要做了些初始化工作,初始化套接字服务,初始化acceptorThreadCount和pollerThreadCount等。

再看看startInternal代码:

Copy
@Override
public void startInternal() throws Exception {

if (!running) {
    running = true;
    paused = false;
    //创建3个缓存
    //频繁创建SocketProcessor成本高
    processorCache = new SynchronizedStack<>(SynchronizedStack.DEFAULT_SIZE,
                                             socketProperties.getProcessorCache());
    eventCache = new SynchronizedStack<>(SynchronizedStack.DEFAULT_SIZE,
                                         socketProperties.getEventCache());
    nioChannels = new SynchronizedStack<>(SynchronizedStack.DEFAULT_SIZE,
                                          socketProperties.getBufferPool());
    //一般情况下,我们自己不配置线程池,所以会进入这个方法,也可以自己在server.xml中配置这个线程池。
    if ( getExecutor() == null ) {
        //创建一个核心线程数是10,最大线程数是200,队列长度是Integer.MaxValue的线程池
        //注意下,这边线程池的逻辑和JDK中线程池的逻辑不一样,
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值