tomcat nio connector : Why Non-Blocking?

Why BIO Blocking?

处理流:Acceptor —– Worker
Acceptor负责接收请求,Worker负责处理请求,Acceptor接收请求以后,交给Worker处理,均由由线程池支持。
Acceptor接收请求以后,如果没有找到空闲的Worker线程,那么Acceptor线程将会被阻塞。
Worker 处理完请求以后,通过response对象写回客户端,如果这个过程由于网络等原因被阻塞,Worker 线程将被阻塞。

Why NIO Non-Blocking?

处理流:Acceptor —Poller— Worker–BlockPoller
处理流程多了两个Poller,中文轮询的意思,单线程程序
Acceptor接收请求以后,将会把该请求Poller维护的一个Selector(队列),Poller将轮询队列,将请求交给给空闲的Worker线程,此过程中Acceptor线程将请求写入队列以后任务完成,直接被释放,总是不会被阻塞。
Worker向客户端写数据时,如果被阻塞,将会将该任务交给BlockPoller维护的另外一个Selector,Worker本身将被释放,BlockPoller将会轮询该队列,在允许的情况下写回数据,所以Worker线程同样总是不会被阻塞的

参考文章:
tomcat架构分析 (connector NIO 实现)
Understanding the Tomcat NIO Connector and How to Configure ItWhat is the difference between Tomcat’s BIO Connector and NIO Connector?

你可能感兴趣的:(tomcat nio connector : Why Non-Blocking?)