前言:
文件IO:
- BIO:读/写(人) –Stream(水流)–> 文件(终点)
- NIO:读/写(人) --> Buffer(车) ==> Channel(高速路) --> 文件(终点)
注意,这个过程中,如果 read()/write() 没有数据的话,会直接返回是没有阻塞的
网络IO(文件是Socket):
-
BIO-TRP模式:读/写 --> Socket <==> ServerSocket --> 读/写
-
NIO-Reactor模式:
读/写 --> Buffer --> Channel =
注册=> Selector --> Socket
<==>
ServerSocket --> Selector =取出=> Channel --> Buffer --> 读/写
注意:Selector#select() 等待感兴趣的事件发生是阻塞等待的。
再来对比一下 BIO 和 NIO:
对于 BIO ,我们最直观的感受就是各种 Stream,后端线程需要阻塞等待客户端写数据(比如read方法),如果客户端不写数据线程就要阻塞。
对于 NIO,我们最直观的感受就是设置为 noblocking 的 Channel,它将等待客户端操作的事情交给了大总管 Selector,Selector 负责轮询所有已注册的客户端,只有当客户端主动触发了现有的事件时,Selector 才会让后端线程去读写 Channel。所以后端线程不需要做任何阻塞等待,直接处理客户端事件的数据即可;处理完马上结束,或返回线程池供其他客户端事件继续使用。
本文标题:【NIO】小结:Buffer、Channel、Selector 关系
本文链接:https://blog.quwenai.cn/post/10010.html
版权声明:本文不使用任何协议授权,您可以任何形式自由转载或使用。







还没有评论,来说两句吧...