1.阻塞与非阻塞的概念
传统的IO流是阻塞式的,当一个现成调用read()或write()时,该线程阻塞,直到有一些数据被读取或写入,该线程在此期间不能执行其他任务。因此,在完成网络通信进行IO操作时,由于线程会阻塞,所以服务器端必须为每一个用户提供一份独立的现成进行处理,当服务器需要大量客户端时,性能急剧下降。
Java NIO是非阻塞式的。当线程从某通道进行读写数据时,若没有数据,该线程可以进行其他任务,线程通常将为阻塞IO的空闲时间用于其他通道上执行IO操作,所以单独的线程可以管理多个输入和输出通道,所以NIO可以使用一个或有限个线程来同时处理连接到服务器的所有客户端。
2.选择器(Selector)
选择器(Selector)是SelectorChannel对象的多路复用器,Selector可以同时监控多个SelectorChannel的IO状况,也就是说,可以利用一个Selector来管理多个Channel。Selector是非阻塞IO的核心,使用单个线程来处理多个channel,相对于多个线程处理多个channel的好处显而易见,节省了开辟新线程和不同的线程之间切换的开销。
两个关键字:Channel和Selector
3.具体过程
首先创建一个Selector选择器,创建服务端Channel并绑定到一个Socket对象,并将该通信信道设置为非阻塞模式。然后就可以调用Selector的selectedkeys方法进行检测已经注册的所有通信信道是否有事情发生,如有事情发生返回所有selectedKey,通过这个对象的Channel方法就可以去这个通信信道的对象,从而读取通信数据Buffer。
通常情况下,一个线程以阻塞方式专门负责监听客户端连接请求,另一个线程专门负责处理请求,这个处理请求的线程才会真正采用NIO的方式。
让Selector来监控一个集合中的所有通道,当有的通道数据准备好了以后,就可以直接到这个通道获取数据,线程2去询问该线程时就可以进行通信。
4.AIO(异步IO)
AIO最主要的特点是回调。
NIO很好用,它解决了阻塞式IO的等待问题,但是它的缺点就是需要我们去轮询,而异步IO可以解决这个问题,线程只需要初始化一下,提供一个回调方法,当数据准备好时,系统会执行回调方法。
NIO实现原理,与I/O的对比优点
最新推荐文章于 2021-06-29 12:23:09 发布