java NIO的工作机制和原理

NIO 全称non-blocking IO,即同步非阻塞的IO。那么NIO与BIO有什么区别呢?BIO是同步阻塞IO,而NIO是同步非阻塞IO,也就是都是自己的工作自己来处理,但是NIO是非阻塞的,非阻塞IO就是当一件事没有完成时,也可以去做别的事情,不用非得等待这件事完成后才能去做别的事情,比如吃饭要排队,BIO就是必须排队吃完饭,再去做别的事情,NIO就是可以先去做别的事情,等会再回来吃饭。说了这么多,让我们看下基于NIO的socket处理过程图。

java NIO的工作机制和原理

上面这个图简单描述了基于NIO的socket请求的处理过程,为了了解整个过程首先了解一下selector和channel是什么意思,selector就是扮演了类似管理员的一个角色,可以管理多个channel,并且selector通过selectedKeys方法可以检测到所有在管理员登记的channel是否有数据需要读取。channel就是客户端和服务端线程数据传输的信道,只要把channel注册到selector上,selector就可以对它进行管理和监测。

当客户端的请求线程和服务端建立连接后,并且channel已经注册到selector上,selector就可以监听channel上的I/O状态,管理员selector就可以通过select()方法检查channel上的I/O是否已经准备好,如果注册的信道I/O状态都没有变化,那么select方法会等待知道超时,如果有多个channel有数据,那么就会把这些数据分配到对应的Buffer中,这样的话,每个连接的数据交互都不是阻塞方式,所以一个线程可以同时处理大量的连接请求。

无论是BIO还是NIO都是同步I/O,那么有没有异步I/O呢?当然有了,异步I/O就是Asynchronous IO,简称AIO,AIO就是在NIO的基础上,引入了异步通道的概念,与NIO不同的是,NIO是一个线程采用轮询的方式不停的检查数据是否已经准备好了,准备好了就处理,AIO是向操作系统注册了IO监听,操作系统完成了IO操作主动触发响应的函数。

那么BIO、NIO、AIO的适用场景分别是什么样的呢?

BIO:适用连接数目较小且固定的架构,在jdk1.4之前的版本中使用。

NIO:适用于连接数目多但是连接比较短的架构中,在jdk1.4中开始支持。

AIO:适用于连接数目较多并且属于长连接的架构,在jdk7中开始支持。