Java NIO系列2:NIO概述

来源:互联网 发布:painter mac 2017 破解 编辑:程序博客网 时间:2024/06/02 01:27

基于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与Channel的关系

从图中可以看到,服务端的线程通过使用Selector可以注册多个连接Connection对象,这样每个Connection主要监听的事件发生,那么就可以及时通知服务端的Thread对象,从而进行下一步的处理。区别于传统的IO模型——每次有新的连接都需要阻塞等待,直到处理结束后再处理下一个Connection。可以看到,这种处理模型在高并发的场景会马上崩掉。

2 0
原创粉丝点击