面试常问:BIO、NIO、AIO
1.BIO、NIO、AIO定义
Java共支持3种网络编程模型IO模式
- BIO:(blocking io)同步并阻塞(传统阻塞型),服务器实现模式为一个连接一个线程,即客户端有连接请求时,服务器就要启动一个线程进行处理,如果这个链接不做任何事,就容易造成不必要的线程开销。可以用线程池改善实现多用户访问一个服务器即实现并发
-
NIO:(non blocking io 或 new io)异步非阻塞,服务器是羡慕时为一个线程处理多个连接请求,即客户端发送的连接请求都会注册到多路复用器上,多路复用器查询到有连接IO请求就返回处理。
NIO 相关类都被放在Java.nio包以及子包下,并且对原Java.io包中的很多类进行改写。
NIO是面向缓冲区(缓冲区其实就对应了一个内存块)、或者说面向块编程的。数据读到一个缓冲区进行稍后处理,这样就增加了处理过程中的灵活性。 -
AIO:异步非阻塞:AIO引入了异步通道的概念,简化了程序编写,有效的请求才启动线程,它的特点是由操作系统完成后,才通知服务器启动线程去处理,一般用于连接数比较多且连接时间较长的应用。
注:
2.BIO、NIO、AIO使用场景
- BIO:适用于链接数目较小且固定的架构,JDK1.4以前唯一的选择。
- NIO:适用于连接数目多且连接比较短的的架构,如聊天服务器,弹幕等,编程比较复杂JDK1.4开始支持。
- AIO: 适用于连接数目多且连接比较长的的架构,编程比较复杂JDK1.7开始支持。
3. NIO 有3大核心部分:channel、buffer、selector
- 一个thread对应一个selector,由selector根据根据不同的事件,在各个通道(channel)上切换。
- 一个selector上注册多个channel
- 一个channel对应一个buffer
- buffer就是一个内存块,底层是有一个数组,数据的读写是通过buffer,你的buffer是双向的可以读也可以写,需要flip切换而在BIO中要么是输入流要么是输出流,不能双向.