java nio基本上常用的组件,selector,channel,buffer。这三个,其他的可以用到的时候再去参考就可以了。


看一本书的时候,基本看前三章或者四章基础知识,剩下的,实际生产中用到了再去看就可以。


大白话解释这三个重要的单词

Channel:

Java的nio中,channel其实是用于传输的,也可以说是管道,是一个工具,可以对比一下io中的流,很类似。但是io中的流都是单向的,但是channel通道是双向的,就是这个通道里既可以读,也可以往里面写。这个channel跟buffer打交道是比较多的,再用nio的时候,读取数据是channel把数据读取到buffer,然后应用再从buffer中读取数据。写数据则是应用程序先把数据写入到buffer中,然后chanel把数据写入到io设备中,就是这样的交互过程


buffer:

buffer常用作解释成缓冲区,再介绍channel的时候,说过数据都是在缓冲区中的,读取数据的是把数据先读到buffer中,然后再从buffer中读数据。nio中的库都是这么操作数据的,并不是再channel中读写数据。缓冲区中有三个重要的状态:position,limit,capacity,再接下来的篇幅中介绍,这里就不多介绍了。


selector

常用作解释成选择器,我把它解释成监听器,用来监听一个或者多个通道,通道可以把自己感兴趣的操作注册到selector上,比如read,write,connect,accept,然后selector负责监听。它是用单线程来处理这些操作的,单线程有单线程的好处,好处就是可以避免多线程之间的线程切换,这样开会会很大。基本一句话说明这个selector是用来管理多个通道的。


下面说说JAVA NIO的io模型,看过java nio都知道都说NIO是异步非阻塞io。


阻塞&非阻塞:

java io是阻塞IO,当你发起一个IO读取数据请求的时候,如果有数据还好可以读,没有数据IO会一直阻塞那里,而NIO则相反,如果没有数据可读就返回,告诉用户线程当前没有数据。


同步&异步:

同步IO发起IO操作的时候会一直等待操作完成,这种操作是同步的。异步IO则是发起IO操作,如果当前没有符合的操作,则返回。


重点:多路复用io模型

其实java nio就是采用多路复用io模型的,NIO中的seletor就是单线程监听注册的channel是否有就绪事件发生,一个线程管理多个channel,只有真正有读写事件发生的时候才会触发操作。多路复用是采用轮训的方式来检测事件是否到达,并对事件追忆进行处理,如果请求的事件比较多,一个线程监听还是有弊端的,处理不过来,会导致新来的事件搁置或者停留达不到快速响应。


JAVA NIO Selector 知识三 http://shangdc.blog.51cto.com/10093778/1956602


JAVA NIO buffer (知识三)

http://shangdc.blog.51cto.com/10093778/1956602


JAVA NIO 之 channel通道(知识二)

http://shangdc.blog.51cto.com/10093778/1955874


JAVA NIO 知识一

http://shangdc.blog.51cto.com/10093778/1955793


欢迎老司机指正,提出更好的讲述和见解。