NIO结构
Channel:通道,连接客户端和服务端的一个管道,管道内可以双向传输数据。
Selector:选择器,可以想象成一个环状传送带,上面可以介入很多管道,selector还可以对每个管道设置感兴趣的颜色
(连接(红色),读(黄色),写(蓝色),接收数据)。当selector开始轮询的时候selector这个传送带就一直转动,当某个管道被传送到感兴趣事件检查点的时候,selector会检查该管道当前颜色(即事件)之前是否被注册成了感兴趣颜色(事件),如果感兴趣,那么selector就可以对这个管道做处理了,比如把管道传给别的线程,让别的线程完成读写操作。
ByteByffer:字节缓冲区,本质上是一个连续的字节数组,selector感兴趣的事件发生后对管道的读操作所读到的数据都存储在ByteBuffer中,
而对管道的写操作也是以ByteBuffer为源头,值得注意的是ByteBuffer可以有多个,想想看,我们使用的所有基本类型都可以转换成byte字节,
比如Integer类型占四个字节,那么传递数字1ByteBuffer底层数组被占用了四个格子。
与传统io比较
1.传统IO一般是一个线程等待连接,连接过来之后分配给processor线程,processor线程与通道连接后如果通道没有数据过来就会阻塞(线程被动挂起)不能做别的事情。NIO则不同,首先,在selector线程轮询的过程中就已经过滤掉了不感兴趣的事件,其次,在processor处理感兴趣事件的read和write都是非阻塞操作即直接返回的,线程没有被挂起。
2.传统io的管道是单向的,nio的管道是双向的。
3.两者都是同步的,也就是java程序亲力亲为的去读写数据,不管传统io还是nio都需要read和write方法,这些都是java程序调用的而不是系统帮我们调用的,nio2.0里这点得到了改观,即使用异步非阻塞AsynchronousXXX四个类来处理。
NIO与传统IO区别
最新推荐文章于 2025-02-21 17:32:13 发布