电子商务的网站的建设内容广州线下培训机构停课
Java中的IO模型
Java中的BIO,NIO,AIO概念可以是针对输入输出流,文件,和网络编程等其他IO操作的。
 但是主要还是在网络编程通信过程中比较重要,因为很多情况网络编程需要它们来提供更好的性能。
 所以本篇文章偏向于网络编程中的BIO,NIO。
 在Java中
 BIO即Blocaking IO,同步阻塞IO
 NIO即Non-Blocking IO,同步非阻塞IO
 AIO即Asynchronous IO,异步IO
 这里的AIO由于使用实现困难。目前应用并不广泛。在系统性能要求较高时,NIO即可满足需求,且具有更简单的实现。
与操作系统IO模型的概念区分
上一篇文章就是操作系统中的IO模型,有五种。阻塞,非阻塞,多路复用,异步,信号驱动IO。
 这里就要注意了。
 Java里的BIO和NIO不就是阻塞IO和非阻塞IO吗?这样不是概念重合了吗?
 其实不是的。
 对于BIO与操作系统中的阻塞IO概念确实基本一致,对于连接与线程是一对一的关系,连接不做事线程就会阻塞。
 但是NIO却不一样,Java的NIO,准确来说是非阻塞的IO多路复用模型。实际上对应的是操作系统IO模型中多路复用的实现。而非阻塞则是多路复用的基础,二者并不是互斥的关系。
 之前的Java NIO文章说过。NIO使用Channel,Selector,Buffer,来进行网络通信。
 其中的Selector就是实现多路复用的组件。使用上就是把Channel及对应想监听的事件注册到Selector上,通过单个线程调用Selector.select()来监听多个注册到其上面的Channel的事件。有事件发生就停止阻塞状态,返回发生的事件数,通过SelectedKeys遍历发生的事件进行处理。
 再想想操作系统中的IO多路复用,不都是一个进程或者线程来监听多个IO事件吗。
 当然多路复用的具体实现在LInux上有select,poll,epoll这三种。Java NIO在Linux系统上使用的就是epoll机制。
结语
NIO的概念与IO模型中的非阻塞IO虽然名字都是非阻塞,但是实际上Java NIO是多路复用的。
 我觉得可能有人分不清,所以写了一下。
 最近再学RPC怎么写。
后面可能出一篇Netty的线程模型。三种多路复用实现。
感谢阅读,如有错漏,烦请批评指正
