Java NIO系列2:NIO概述

基于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
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值