NIO 基础
non-blocking-io 非阻塞IO
1. 三大组件
1.1 Channel & Buffer
channel 有一点类似与strem,他就是读写数据的双向通道,可以从channel将数据读入buffer,也可以将buffer写入channel,而之前的strem要么是输入,要么是输出,channel比stream更为底层

1.1.1常见的channel有
FileChannel
DatagramChannel
SocketChannel
ServerSocketChannel
1.1.2常见的buffer有
ByteBuffer:
MappedByteBuffer
DirectByteBuffer
HeapByteBuffer
ShortBuffer
IntBuffer
LongBuffer
FloatBuffer
DoubleBuffer
CharBuffer
1.2 Selector 选择器
selector 单从字面意思不好理解,需要结合服务器的设计演化来理解它的用途
多线程版本设计

缺点:
内存占用高
线程上下文切换成本高
只适合连接少的场景
线程池版本设计

缺点:
阻塞模式下,线程仅能处理一个sokcet链接
仅适合短连接场景
selector版设计

selector作用就是配合一个线程来管理多个channel,获取这些channel上发生的事件,channel工作在非阻塞模式下,不会让线程吊死在一个channel上。特别适合链接数特别多,但流量低的场景
调用selector的select()会阻塞直接channe发生了读写就绪事件,这些事件发送,select方法就会返回这些事件交给thread来处理。