NIO基础

1. 三大组件

1.1 Channel & Buffer

常见的channel有:

  • FileChannel
  • DatagramChannel
  • SocketChannel
  • ServerSocketChannel
    常见的buffer:
  • ByteBuffer
    • MappedByteBuffer
    • DirectByteBuffer
    • HeapByteBuffer
  • ShortBuffer
  • IntBuffer
  • ...

1.2 Selector

原本多线程版本(一个socket一个线程)问题:

  • 内存占用高
  • 线程上下文切换成本高
  • 只适合连接数少的场景

线程池版本可以解决线程数过高的问题,但是新问题:

  • 阻塞模式下,线程仅能处理一个socket连接
  • 仅适合短连接场景

selector版设计:
selector的作用就是配合一个线程来管理多个channel,获取这个channel上发生的事件,这些channel工作在非阻塞模式下,不会让线程吊死在一个channel上。适合连接数多,但流量低的场景。
调用selector的select()会阻塞直到channel发生了读写就绪事件,发生后select方法就会将其交给线程来处理。