Java NIO系列2:NIO概述
2016-04-18 15:01
447 查看
基于NIO的IO与之前的BIO有所不同,NIO的核心部分主要由三个类组成:Channel、Selector和Buffer。
三者的之间的关系可以这样理解:现在假设有两个进程需要通信,进行A首先将数据传到进程A所在的缓冲区(位于操作系统用户空间的缓冲区),然后缓冲区将数据释放到通道中,数据流经通道,之后将通道的数据排出到进程B所在的缓冲区,进程B的程序代码就可以对进程B所在的缓冲区的数据进行一系列的操作了。这个过程并没有出现Selector(选择器),那么选择器是干嘛的呢?说得简单点,选择器的作用是一个观察者,可以让线程监听各个注册通道中的事件,使得线程可以对注册事件进行操作(比如连接的建立、断开等)。
Channel可以理解为通道,是执行I/O操作的入口,数据可以流向通道,也可以从通道流出。
Channel接口的实现在Java中主要有以下几个:
FileChannel
DatagramChannel
SocketChannel
ServerSocketChannel
Buffer则是缓冲区,缓冲区是装了固定数量的容器,缓冲区的作用像一个存储器,缓冲区可以被写满或者被释放。如果把通道比作是I/O的入口,那么缓冲区则是I/O的来源,通道的数据需要从缓冲区得到,通道的数据排出的地方也是缓冲区。如果理解TCP/IP的传输协议,这点应该不难理解。
Buffer接口的主要实现有:
ByteBuffer(字节缓冲区)
CharBuffer
DoubleBuffer
FloatBuffer
IntBuffer
LongBuffer
ShortBuffer
Selector是选择器,选择器通常与通道关联,一个线程可以使用选择器处理多个通道(可以理解为Web服务器的多个连接),使用选择器可以方便线程处理多个连接的触发事件,比如开启了连接、发送了数据以及断开连接等事件。而需要使用Selector仅仅需要将通道(连接)注册到Selector上就可以。
所以Selector与Channel的关系是这样的:
从图中可以看到,服务端的线程通过使用Selector可以注册多个连接Connection对象,这样每个Connection主要监听的事件发生,那么就可以及时通知服务端的Thread对象,从而进行下一步的处理。区别于传统的IO模型——每次有新的连接都需要阻塞等待,直到处理结束后再处理下一个Connection。可以看到,这种处理模型在高并发的场景会马上崩掉。
三者的之间的关系可以这样理解:现在假设有两个进程需要通信,进行A首先将数据传到进程A所在的缓冲区(位于操作系统用户空间的缓冲区),然后缓冲区将数据释放到通道中,数据流经通道,之后将通道的数据排出到进程B所在的缓冲区,进程B的程序代码就可以对进程B所在的缓冲区的数据进行一系列的操作了。这个过程并没有出现Selector(选择器),那么选择器是干嘛的呢?说得简单点,选择器的作用是一个观察者,可以让线程监听各个注册通道中的事件,使得线程可以对注册事件进行操作(比如连接的建立、断开等)。
Channel可以理解为通道,是执行I/O操作的入口,数据可以流向通道,也可以从通道流出。
Channel接口的实现在Java中主要有以下几个:
FileChannel
DatagramChannel
SocketChannel
ServerSocketChannel
Buffer则是缓冲区,缓冲区是装了固定数量的容器,缓冲区的作用像一个存储器,缓冲区可以被写满或者被释放。如果把通道比作是I/O的入口,那么缓冲区则是I/O的来源,通道的数据需要从缓冲区得到,通道的数据排出的地方也是缓冲区。如果理解TCP/IP的传输协议,这点应该不难理解。
Buffer接口的主要实现有:
ByteBuffer(字节缓冲区)
CharBuffer
DoubleBuffer
FloatBuffer
IntBuffer
LongBuffer
ShortBuffer
Selector是选择器,选择器通常与通道关联,一个线程可以使用选择器处理多个通道(可以理解为Web服务器的多个连接),使用选择器可以方便线程处理多个连接的触发事件,比如开启了连接、发送了数据以及断开连接等事件。而需要使用Selector仅仅需要将通道(连接)注册到Selector上就可以。
所以Selector与Channel的关系是这样的:
从图中可以看到,服务端的线程通过使用Selector可以注册多个连接Connection对象,这样每个Connection主要监听的事件发生,那么就可以及时通知服务端的Thread对象,从而进行下一步的处理。区别于传统的IO模型——每次有新的连接都需要阻塞等待,直到处理结束后再处理下一个Connection。可以看到,这种处理模型在高并发的场景会马上崩掉。
相关文章推荐
- ubuntu搭建java开发环境
- Bitmap java实现
- Android studio及eclipse中的junit单元测试
- java集合-TreeSet
- J2SE(六)Java之类的初始化
- springmvc源码分析
- Java连接hadoop注意事项及实例
- JDK7.0 与 JDK6.0 区别 及 JDK7的新特性
- struts2中ognl标签具体解释
- java.util 中的property
- mac 下eclipse 安装svn插件
- 【记录】使用 ZipInputStream类getNextEntry方法遇到的错误
- Java 自定义异常类
- 【SSH框架】--SpringAOP
- Java定位CPU使用高问题
- Spring4.2源码解析-下载源码并导入eclipse
- Java throw与throws区别
- 解决eclipse导出javadoc时的“错误: 编码GBK的不可映射字符”问题
- Java多线程开发系列之番外篇:事件派发线程
- android studio转eclipse(二)