Java NIO是一种非阻塞I/O模型,它提供了一种新的I/O操作方式,可以在单线程中同时处理多个连接. Java NIO中的Selector是一个可选择通道的对象,用于检查一个或多个NIO Channel的状态是否处于可读、可写等事件。
而lO多路复用的select是Linux系统提供的一种I/O多路复用机制,它可以同时监控多个文件描述符,当其中有文件描述符就绪(一般是读写就绪),则立即通知用户进程。
因此,Java NIO和lO多路复用的select都是实现I/O多路复用的机制,但是Java NIO是Java自己实现的,而lO多路复用的select是Linux系统提供的。
新的输入/输出 (NIO) 库是在 JDK 1.4 中引入的,弥补了原来的 I/O 的不足,提供了高速的、面向块的 I/O。
NIO 常常被叫做非阻塞 IO,主要是因为 NIO 在网络通信中的非阻塞特性被广泛使用。
NIO 实现了 IO 多路复用中的 Reactor 模型,一个线程 Thread 使用一个选择器 Selector 通过轮询的方式去监听多个通道 Channel 上的事件,从而让一个线程就可以处理多个事件。
通过配置监听的通道 Channel 为非阻塞,那么当 Channel 上的 IO 事件还未到达时,就不会进入阻塞状态一直等待,而是继续轮询其它 Channel,找到 IO 事件已经到达的 Channel 执行。
因为创建和切换线程的开销很大,因此使用一个线程来处理多个事件而不是一个线程处理一个事件,对于 IO 密集型的应用具有很好地性能。
应该注意的是,只有套接字 Channel 才能配置为非阻塞,而 FileChannel 不能,为 FileChannel 配置非阻塞也没有意义。
NIO 与普通 I/O 的区别主要有以下两点:
-
NIO 是非阻塞的;
-
NIO 面向块,I/O 面向流。
对于select的说明,可以阅读另一篇文章的说明: