NIO:
同步非阻塞,服务器实现模式为一个线程处理多个请求,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有IO请求就进行处理。
连接数目多,且连接比较短,用于聊天室,弹幕系统
NIO是JDK1.4 JAVA提供了一系列改进的输入/输出的新特性,被统称为NIO,同步非阻塞IO,相关的类都在java.nio包内
NIO的特性:
NIO有三个核心部分:
Channel(管道),Buffer(缓冲区),selector(选择器)
1.NIO是面向缓冲区,或者面向块编程的,数据读取到一个他稍后处理的缓冲区(Buffer),需要时可在缓冲区中前后移动,这就增加了处理过程中的灵活性,使用它可以提供非阻塞的高伸缩性网络。
2.Java NIO 的非阻塞模式,使一个线程从某通道发送请求或者读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取,而不是保持线程阻塞,所以直至数据变得可以读取之前,该线程可以继续做其他的事情,非阻塞写也是如此,一个线程请求写入一些数据到某通道,但不需要等待它完全写入,这个线程工时可以去做别的事情
3.NIO是可以做到用一个线程来处理多个操作的。假设有10000个请求过来,根据实际情况,可以分配50或者100个线程来处理,不像之前的阻塞IO那样 必须得分配10000个
4.HTTP2.0使用了多路复用技术,做到同一个连接并发多个请求,而且并发请求的数量比HTTP1.0大了好几个数量级
根据以上特性,我们可以总结出NIO与BIO的差别
1.BIO以流的方式处理数据,而NIO以块的方式处理数据,块I/O的效率比流的I/O效率高很多
2.BIO是阻塞的,NIO则是非阻塞的
3.BIO基于字节流和字符流进行操作,而NIO基于Channer和Buffer进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区中写入到通道里,Selector用于监听多个通道事件(比如连接请求,数据到达等),因此使用单个线程就可以监听多个客户端通道
下面是NIO的流程图:
根据关系图可以看出:
1.每个Channel都会对应一个Buffer(或者buffer数组).
2.Selector对应一个线程,一个线程对应多个Channel.
3.该图反应了有两个Channel 注册到Selector,程序切换到哪个Channel,是有事件决定的,Event就是很重要的概念
4.Selector会根据不同的事件,在各个通道上切换
5.Buffer 就是一个内存块,底层是一个数组,数据的读取 写入是通过Buffer,这个和BIO有本质不同的,BIO要么数输入流,或者输出流,不能双向,但是NIO得BUffer是可以读 也可以写的 但是需要切
6.Channel 是双向的,可以返回底层操作系统的情况,比如Linux,底层的操作系统通道就是双向的
学习年限不足,知识过浅,说的不对请见谅。
世界上有10种人,一种是懂二进制的,一种是不懂二进制的。
来源:CSDN
作者:jym12138
链接:https://blog.csdn.net/weixin_43326401/article/details/104138419