java NIO与BIO的区别?
BIO -- Blocking IO 即阻塞式 IO。
NIO -- Non-Blocking IO, 即非阻塞式 IO 或异步 IO。
BIO 基于字节流和字符流进行操作,数据的读取写入必须阻塞在一个线程内等待其完成。
NIO 主要有三大核心部分:
- Channel (通道):所有的 NIO 操作始于通道,通道是数据来源或数据写入的目的地。
- Buffer (缓冲区):一个 Buffer 本质上是内存中的一块,我们可以将数据写入这块内存,之后从这块内存获取数据
- Selector (选择器、多路复用器):多路复用,用于实现一个线程管理多个 Channel
NIO 基于 Channel 和 Buffer 进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。Selector 用于监听多个通道的事件(比如:连接打开,数据到达)。因此,单个线程可以监听多个数据通道,处理多个事件。
综上,它们之间的区别有:1、BIO,面向流的,只能读或者只能写,同步阻塞 IO 模式
2、NIO,面向块的(缓冲区),可以同时进行读写,同步阻塞 IO 模式
同步阻塞、同步非阻塞、异步的区别?
同步阻塞:调用者发出请求后会一直等待结果
同步非阻塞:调用者发出请求后就去执行其他任务,过一会再询问被调用者执行结果
异步:当一个异步过程调用发出后,调用者不会立即得到结果。而是在“发出后”,“被调用者“通过状态,来通知调用者,或通过回调函数处理这个调用
阻塞式IO、非阻塞式IO甚至包括多路复用IO都是基于操作系统级别对“同步IO”的实现