前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一图理解tomcat线程模型

一图理解tomcat线程模型

作者头像
崔认知
发布2023-09-18 14:25:00
6860
发布2023-09-18 14:25:00
举报
文章被收录于专栏:nobodynobody

基于tomcat-embed-core:9.0.60 , Http11NioProtocol(默认启用的)

【servlet3异步支持模型,下次上图】

1、tomcat关键的三种类型线程:Acceptor Thread(接收客户端连接,一个线程)、Poller Thread(轮询处理网络IO读写事件及事件队列,一个线程)、业务处理线程(线程池);

2、Acceptor Thread中的监听socket为阻塞模式,可以设置tcp全连接队列大小。创建的客户端连接会进入Poller Thread的事件队列,等待Poller Thread轮询处理

相关源码:

启动Acceptor Thread线程:

代码语言:javascript
复制
org.apache.tomcat.util.net.AbstractEndpoint#startAcceptorThread
代码语言:javascript
复制
protected void startAcceptorThread() {
        acceptor = new Acceptor<>(this);
        String threadName = getName() + "-Acceptor";
        acceptor.setThreadName(threadName);
        Thread t = new Thread(acceptor, threadName);
        t.setPriority(getAcceptorThreadPriority());
        t.setDaemon(getDaemon());
        t.start();
    }

客户端连接进入Poller Thread的事件队列:

3、Poller Thread 采用Reactor模型,会处理事件队列及网络IO事件。

源码见:

代码语言:javascript
复制
org.apache.tomcat.util.net.NioEndpoint.Poller#run

网络IO事件的处理,会由业务线程池提交异步执行:

代码语言:javascript
复制
org.apache.tomcat.util.net.AbstractEndpoint#processSocket

5、每种线程类型都会有一个队列伴随,只不过Acceptor Thread的队列属于tcp全连接队列,tcp半连接队列容量可以通过操作系统配置(注意每种类型的队列容量是否受限);

6、业务处理完返回数据时,如果返回数据太大,即写缓冲区容量不够,会进入Poller Thread事件队列,注册写事件,轮询下次继续写回数据。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-09-16 19:46,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 认知科技技术团队 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档