Tomcat的NIO线程模型

今天研究了一天Tomcat的NIO模型,发现仅仅是在接收请求的时候是真正的NIO,后续的处理其实还是BIO,也就是还是一个请求用一个worker线程来处理。这样的话,我感觉NIO的性能提升对于BIO其实并不大,因为NIO只是减少了工作线程等待从socket中读取数据的时间。但是我感觉这种场景在HTTP领域并不多见吧,因为很少有浏览器在创建TCP连接后会长时间不发数据吧。。。总的来说,NIO与BIO的不同集中在建立TCP连接的部分,连接建立后的处理请求实际上没什么不同。

还有,我感觉即使是使用了NIO,到头来和客户端连接的socket还是BIO的socket。这个是不是就是所谓的:NIO连接器在建立连接的时候,使用NIO监听,但是创建的socket还是BIO的socket???感觉还是很模糊啊!!还要好好钻研!!!

我理解的NIO接收TCP连接,然后去处理请求的流程就是:

1.acceptor线程负责监听端口,创建好客户端发送过来的TCP连接。来了一个TCP连接后,就有了一个socket。

2.acceptor线程获得一个socket后,就把socket包装成NioChannel,通过调用poller对象的register方法,把这个socket添加进poller的同步队列中。至于要使用同步队列的原因是,acceptor线程和poller线程是这个队列的生产者和消费者,涉及到并发控制,所以要使用同步队列。

3.在poller线程中,注意这个poller线程就是上面所说的poller对象,这个对象实现了Runnable接口。在这个线程中,执行一个无限循环,首先把acceptor线程添加进来的socket取出来,添加进自己(poller对象)的Selector中。接着就是典型的NIO,也就是IO多路复用的操作了,调用Selector的select方法,等待所注册的socket可以读取。最后,把这次select出的结果,也就是所有可以读取的socket,分别派给worker线程池处理(线程池的默认大小是200),其中一个socket由一个worker线程处理,也就是一个请求由一个线程处理。

4.后续的,我觉得就和BIO一样了。

不知道准不准确,毕竟Tomcat的源码比较复杂。。。

具体poller的源码看:https://blog.csdn.net/andy_zhang2007/article/details/78792541

发布了63 篇原创文章 · 获赞 7 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/sinat_30955745/article/details/105153508