NIO实现原理

1. 什么是NIO?

  • NIO(No-blocking I/O):Java中的非阻塞IO模型,允许单个线程处理多个连接,通过选择器(Selector)监控多个通道(Channel)的状态,实现高效的IO操作。

2. NIO实现原理

  • 核心组件:
    • Channel(通道): Channel类似于传统的流。Channel可以使读、写或者读写的,并且可以异步地进行IO操作。常见的ChannelFileChannelSocketChannelDatagramChannel等。
    • Buffer(缓冲区): Buffer是一个用于存储数据的容器。所有数据都是从Channel读入到Buffer,或者从Buffer写入到Channel。常见的BufferByteBufferCharBuffer等。Buffer对象包含三个重要的属性:position(当前位置)、limit(限制位置)和capacity(容量)。
    • Selector(选择器): Selector是NIO的核心组件之一,它允许单个线程监控多个Channel的状态。当其中某个Channel发生读写事件时,可以通过Selector得到通知。

  • 工作原理:
    1. 打开Channel:通过FileChannelSocketChannelServerSocketChannel等类的静态方法open()打开一个通道。
    2. 创建Buffer:创建一个或多个Buffer,用于读取或写入数据。
    3. 将数据写入Channel:将数据写入Buffer,然后将Buffer中的数据写入Channel
    4. Channel读取数据: 将Channel中的数据读取到Buffer中。
    5. 注册ChannelSelector:通过Selector监听一个或多个Channel,当Channel上发生感兴趣的事件时,Selector将通知程序。
    6. 处理事件:在一个循环中调用Selectorselect()方法,该方法会阻塞直到至少一个注册的Channel发生了感兴趣的事件。然后通过迭代selectedKeys()获取SelectionKey,从而得知哪个Channel上发生了事件。