NIO
三大组件
Channel & Buffer
channel有点类似于stream,它是读写数据的双向通道
,可以从channel将数据读入buffer,也可以将buffer的数据写入channel,而之间文件操作使用的stream要么是输入,要么是输出,channel比stream更为底层。
常见的Channel
- FileChannel:用于操作文件
- DatagramChannel:用于UDP协议
- SocketChannel:用于TCP协议
- ServerSocketChannel:用于TCP协议
常见的Buffer
ByteBuffer
- MappedByteBuffer
- DirectByteBuffer
- HeapByteBuffer
- ShortBuffer
- IntBuffer
- LongBuffer
- FloatBuffer
- DoubleBuffer
- CharBuffer
Selector
传统多线程版服务器程序设计
服务器会为每个客户端创建新的线程与套接字进行会话
缺点
- 内存占用高
- 线程上下文切换成本高
与cpu有直接关系,cpu线程数表示当前可并行的线程数量,唤醒状态的线程失去cpu时间片段后需要保存当前的线程执行信息(例如指令执行到哪一行等)
- 只适合连接数少的场景
线程池版服务器程序设计
客户端需要等待线程池有空闲线程时才能继续处理请求
缺点
- 阻塞模式下,线程仅能处理一个socket连接
- 仅适合短连接场景
Selector版服务器设计
selector的作用就是配合一个线程来管理多个channel,获取这些channel上发生的事件,这些channel工作在非阻塞模式下,不会让线程吊死在一个channel上。适合连接数特别多,但流量低的场景
调用selector的select()
方法会阻塞直到channel发生了读写就绪事件,这些事件发生,select方法就会返回这些事件交给thread来处理