您的位置:首页 > 编程语言 > Java开发

Java NIO系列2:NIO概述

2016-04-18 15:01 447 查看
基于NIO的IO与之前的BIO有所不同,NIO的核心部分主要由三个类组成:ChannelSelectorBuffer

三者的之间的关系可以这样理解:现在假设有两个进程需要通信,进行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。可以看到,这种处理模型在高并发的场景会马上崩掉。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: