IO和NIO

2022-11-29 09:25:49 浏览数 (1)

1、主要区别:

io是面向流、阻塞的。 Nio是面向缓存、非阻塞的。 传统IO基于字节流和字符流进行操作。 NIO基于Channel(通道)、Buffer(缓冲区)进行操作,数据从通道读取到缓冲区中,或者从缓冲区读取到通道中。 NIO中使用Selector(选择区)监听多个Channel(通道)事件,因此单个线程可以监听多个数据通道。(比如:连接打开,数据到达)

2、IO 工作流程:

由于Java IO是阻塞的,所以当面对多个流的读写时需要多个线程处理。例如在网络IO中,Server端使用一个线程监听一个端口,一旦某个连接被accept,创建新的线程来处理新建立的连接。其中 read/write 是阻塞的。

3、NIO 工作流程:

NIO 提供 Selector 实现单个线程管理多个channel的功能。select 调用可能是阻塞的,也可以是非阻塞的。但是read/write是非阻塞的!

4、NIO为什么会被阻塞:

代码语言:javascript复制
//这个方法可能会阻塞,直到有一个已注册的事件发生,或者当一个或者更多的事件发生时
//可以设置超时时间,防止进程阻塞
selector.select(long timeout);

//使用此方法可以防止阻塞,阻塞在select()方法上的线程也可以立刻返回,不阻塞
selector.selectNow();

//可以唤醒阻塞状态下的selector
selector.wakeup();

5、BIO、NIO、AIO 有什么区别:

BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方 便,并发处理能力低。 NIO:New IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道) 通讯,实现了多路复用。 AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的 操作基于事件和回调机制。

0 人点赞