NIO(Non-Blocking Input/Output)

  • 三大组件
  1. Channel
  2. Buffer
  3. Selector

Selector

  • Selector可以和一个线程合作,可以理解为Selector是摄像头,可以同时监听多个Channel的I/O状态,然后交由一个线程去处理这些就绪事件
  • 你可以把 Selector 想成一个 监控中心(摄像头)。
  • 它一直盯着多个 门口(Channel)。
  • 一旦某个门口有人按门铃(I/O 就绪),监控中心就通知唯一的值班员(线程)过去处理。
  • 相较于传统的IO而言:
    • 传统阻塞 I/O:一个连接对应一个线程,线程多了就很浪费(上下文切换,CPU核数不够等)。
    • NIO + Selector:一个线程就能处理成千上万个连接的 I/O 事件,大幅减少线程切换和资源占用。

ByteBuffer

  • 大致有两个部分:Channel(数据来源/目标)和 Buffer(数据中转区)。
  1. 初始为写模式,调用 channel.read(buffer) 将数据写入缓冲区。
  2. 调用 flip() 切换为读模式(limit = position; position = 0)。
  3. 使用 get() 从缓冲区读取数据。
  4. 数据读完后,调用 clear() 切回写模式(position = 0; limit = capacity),准备下一轮写入。
  5. 重复执行,直到通道数据全部读取完毕。
  6. 如果缓冲区还有未读数据且需要续读,则用 compact() 代替 clear() 保留剩余数据。