1.详解tomcat的连接数与线程池
https://www.cnblogs.com/kismetv/p/7806063.html
不同的Tomcat版本支持的protocol不同,其中最典型的protocol包括BIO、NIO和APR(Tomcat7中支持这3种,Tomcat8增加了对NIO2的支持,而到了Tomcat8.5和Tomcat9.0,则去掉了对BIO的支持)。
在Tomcat7中,自动选取使用BIO或APR(如果找到APR需要的本地库,则使用APR,否则使用BIO);在Tomcat8中,自动选取使用NIO或APR(如果找到APR需要的本地库,则使用APR,否则使用NIO)。
2.tomcat架构分析(概览)
https://www.iteye.com/blog/gearever-1532822
3.tomcat架构分析(connector BIO 实现)
https://www.iteye.com/blog/gearever-1841586
4.tomcat架构分析 (connector NIO 实现)
https://www.iteye.com/blog/gearever-1844203
图中Acceptor及Worker分别是以线程池形式存在,Poller是一个单线程。注意,与BIO的实现一样,缺省状态下,在server.xml中没有配置,则以Worker线程池运行,如果配置了,则以基于java concurrent 系列的java.util.concurrent.ThreadPoolExecutor线程池运行。
Poller
Poller线程中维护了一个Selector对象,NIO就是基于Selector来完成逻辑的。在connector中并不止一个Selector,在socket的读写数据时,为了控制timeout也有一个Selector,在后面的BlockSelector中介绍。可以先把Poller线程中维护的这个Selector标为主Selector。
Poller是NIO实现的主要线程。首先作为events queue的消费者,从queue中取出PollerEvent对象,然后将此对象中的channel以OP_READ事件注册到主Selector中,然后主Selector执行select操作,遍历出可以读数据的socket,并从Worker线程池中拿到可用的Worker线程,然后将socket传递给Worker。整个过程是典型的NIO实现。
5.tomcat优化——并发和Tomcat线程数
https://blog.csdn.net/hunhun1122/article/details/78818337