什么是NIO
Java NIO全称java non-Blocking IO 是java1.4开始,新提供一系列改进Input/Output的新特性,统称为NIO,是同步非阻塞也是面向Buffer开发的什么是同步非阻塞的呢?按照我们普通的IO来说,当一条线程去read()或write()一些数据时,会一直等待返回结果,也就是说不能干其他的事情,这样大大降低了线程的效率,如下图
而NIO就很好的弥补了这个问题,实现NIO主要有三个工具非常重要Buffer、Channel、Selector,我们先来看看这三个组件的关系图
我给大家解释一下上面的关系图
1.一个线程对应一个Selector
2.一个Selector允许注册多条Channel,也就是说一个线程对应多个Channel,上图就表示了有三个Channel注册到了Selector里
3.每个Channel都有自己的Buffer(缓冲区)
4.这里有一个重要的概念,事件(Event),Selector就是通过不同的事件来切换到不同的Channel来读写数据
5.看到上图也知道了为什么NIO是面向Buffer的了,数据的读写都是通过Buffer,Buffer是一个内存块
6.IO、BIO都是通过流(Stream)来进行读取数据,要么读、要么写,但是NIO通过Buffer做到了读写皆可,使用flip()切换,也表明的Channel是双向
来看看使用NIO时线程的使用效率
NIO与其它IO的区别
NIO | BIO | AIO | |
---|---|---|---|
IO模型 | 同步非阻塞 | 同步阻塞 | 异步非阻塞 |
吞吐量 | 高 | 低 | 高 |
java对各I/O的支持 | 服务器实现一个请求一个线程,当服务器收到了连接请求注册到Selector上,然后Selector来通过轮询来查看有没有新的I/O请求,有的话则启动线程来处理 | 服务器实现一个请求一个线程,即来一个请求启动一个线程进行接收,但是如果线程长时间处于无事可做的状态会导致CPU开销过大,使用线程池处理的问题:同步阻塞IO,读写阻塞,线程等待时间过长;多线程之间的上下文切换,耗费资源;需要根据CPU来限定可用线程的数量,不能根据并发数,要不然很难做到公平的资源分配 | 服务器实现一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理 |
适用场景分析 | 连接数量多且适用小文件传输架构,例如IM服务器,JDK1.4后开始支持 | 连接数量少且固定的架构,对服务器资源要求高,并发局限于应用程序中,JDK1.4前的唯一选择 | 连接数量多且适用大文件传输架构,充分调用OS进行并发,JDK7之后开始支持 |
开发难度 | 复杂 | 简单 | 复杂 |
完成:2021/3/27 16:57 ALiangX
转载请标注原作者,谢谢你们的支持,能给个小心心吗?