Tomcat支持三種接收請求的處理方式
1)BIO 阻塞IO,對應 org.apache.coyote.http11.Http11Protocol
2) NIO 非阻塞IO,基於selectort實現,對應 org.apache.coyote.http11.Http11NIOProtocol
3) APR, 對應org.apache.coyote.http11.Http11AprProtocol
4) AIO 異步非阻塞IO, 對應 org.apache.coyote.http11.Http11NIO2Protocol
tomcat BIO線程模型
tomcat的NIO線程模型
Acceptor: 監聽Socket消息,並見消息放入事件隊列
PollerEvent: 事件隊列
Poller: 默認爲單線程,從事件隊列中取出Socket, 交給Worker線程池處理
Poller線程中維護了一個Selector對象,NIO就是基於Selector來完成的。
Worker: IO處理線程池
NIO的實現過程:
1) Poller是NIO實現的主要線程
2) 首先作爲事件隊列的消費者,從隊列中取出PollerEvent對象
3) 將對象中的channel以OP_READ事件註冊到主Selecor中
4)主Selectotr執行select操作,遍歷出可以讀數據的socket
5) 將socket交給Worker線程池處理
NIO代碼解析
Http11NioProtocol類