BIO/NIO/AIO

什么是 BIO
  • BIO 是同步阻塞式 IO,JDK1.4 之前的 IO 模型。
  • 服务器实现模式为一个连接请求对应一个线程,服务器需要为每一个客户端请求创建一个线程,如果这个连接不做任何事会造成不必要的线程开销。
  • 可以通过线程池改善,这种 IO 称为伪异步 IO。
  • 适用连接数目少且服务器资源多的场景。

什么是 NIO
  • NIO 是 JDK1.4 引入的同步非阻塞 IO。
  • 服务器实现模式为多个连接请求对应一个线程,客户端连接请求会注册到一个多路复用器 Selector ,Selector 轮询到连接有 IO 请求时才启动一个线程处理。
  • 适用连接数目多且连接时间短的场景。

同步是指线程还是要不断接收客户端连接并处理数据,非阻塞是指如果一个管道没有数据,不需要等待,可以轮询下一个管道。

核心组件:
  • Selector: 多路复用器,轮询检查多个 Channel 的状态,判断注册事件是否发生,即判断 Channel 是否处于可读或可写状态。使用前需要将 Channel 注册到 Selector,注册后会得到一个 SelectionKey,通过 SelectionKey 获取 Channel 和 Selector 相关信息。

  • Channel: 双向通道,替换了 BIO 中的 Stream 流,不能直接访问数据,要通过 Buffer 来读写数据,也可以和其他 Channel 交互。

  • Buffer: 缓冲区,本质是一块可读写数据的内存,用来简化数据读写。Buffer 三个重要属性:position 下次读写数据的位置,limit 本次读写的极限位置,capacity 最大容量。

  • flip 将写转为读,底层实现原理把 position 置 0,并把 limit 设为当前的 position 值。
    clear 将读转为写模式(用于读完全部数据的情况,把 position 置 0,limit 设为 capacity)。
    compact 将读转为写模式(用于存在未读数据的情况,让 position 指向未读数据的下一个)。
    通道方向和 Buffer 方向相反,读数据相当于向 Buffer 写,写数据相当于从 Buffer 读。
    使用步骤:向 Buffer 写数据,调用 flip 方法转为读模式,从 Buffer 中读数据,调用 clear 或 compact 方法清空缓冲区。


什么是 AIO
  • AIO 是 JDK7 引入的异步非阻塞 IO。
  • 服务器实现模式为一个有效请求对应一个线程,客户端的 IO 请求都是由操作系统先完成 IO 操作后再通知服务器应用来直接使用准备好的数据。
  • 适用连接数目多且连接时间长的场景。

异步是指服务端线程接收到客户端管道后就交给底层处理IO通信,自己可以做其他事情,非阻塞是指客户端有数据才会处理,处理好再通知服务器。

实现方式包括通过 Future 的 get 方法进行阻塞式调用以及实现 CompletionHandler 接口,重写请求成功的回调方法 completed 和请求失败回调方法 failed。

posted @ 2022-05-22 23:55  张三丰学Java  阅读(16)  评论(0编辑  收藏  举报