I/O模型基本说明
- Java NIO全称java non-blocking IO。从JDK1.4开始,java提供一系列改进的输入/输出的新特性,被统称为NIO(New IO),是同步非阻塞的。
- NIO相关类都被放在java.nio包及子包下,并且对原java.io包中的很多类进行改写
- NIO有三大核心部分:Channel(通道),Buffer(缓冲区),Selector(选择器)
- NIO是面向缓冲区,或者面向块编程的。数据读取到一个它稍后处理的缓冲区,需要时可在缓冲区前后移动,这就增加了处理过程中的灵活性,使用它可以提供非阻塞式的高伸缩性网络
- java NIO的非阻塞模式。一个线程从某通道发送请求或者读取数据,如果目前没有数据可用,就什么都不会获取,而不是保持线程阻塞,所以直至数据变得可以读取之前,该线程可以继续做其他的事情。非阻塞写也是如此,一个线程请求写入一些数据到某通道,但不需要等待它完全写入,这个线程同时可以去做别的事情
- 通俗理解:NIO是可以做到一个线程处理多个操作。假设10000个请求过来,根据实际情况,可以分配50或者100个线程来处理。不像之前的阻塞IO那样,非得分配1000个
- HTTP2.0使用了多路复用的技术,做到同一个连接并发处理多个请求,并且并发请求的数量比HTTP1.0大了好几个数量级
NIO和BIO的比较
- BIO以流的方式处理数据,而NIO以块的方式处理数据,块I/O的效率比流I/O高很多
- BIO是阻塞的,NIO是非阻塞的
- BIO基于字节流和字符流进行操作,而NIO基于Channel(通道)和Buffer(缓冲区)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写道通道中。Selector(选择器)用于监听多个通道的事件(比如:连接请求,数据到达等),因此使用单线程就可以监听多个客户端通道