
由一个独立的Acceptor线程负责监听客户端连接,接收到连接请求后,为每个客户端创建一个新的线程进行链路处理,处理完后通过输出流返回给客户端,然后销毁线程。
传统BIO的最大问题就是,每个连接都需要创建新的线程来处理,这种模型显然无法满足高性能、高并发的场景。

将客户端的socket封装成Task,放到任务队列中,通过线程池维护一个消息队列和N个活跃线程,对消息队列中的任务进行处理。提高了并发能力。但是并没有解决阻塞的问题。
缓冲区实质上是一个数组,每种Java基本类型除了Boolean外,都对应一种缓冲区:



ServerSocketChannel acceptorSvr = ServerSocketChannel.open();

NIO 2.0引入新的异步通道概念,并提供了异步文件通道和异步套接字通道的实现。
异步通道提供以下两种方式获取操作结果:
CompletionHandel接口的实现类作为操作完成的回调。
| 特性 | 同步阻塞IO(BIO) | 伪异步IO | 非阻塞IO(NIO) | 异步IO(AIO) |
|---|---|---|---|---|
| 客户端个数:IO线程数 | 1:1 | M:N(M可大于N) | M:1(1个IO线程处理多个客户端连接) | M:0(不需要启动额外的IO线程,被动回调) |
| IO类型(阻塞) | 阻塞IO | 阻塞IO | 非阻塞IO | 非阻塞IO |
| IO类型(同步) | 同步IO | 同步IO | 同步IO(IO多路复用) | 异步IO |
| API难度 | 简单 | 简单 | 非常复杂 | 复杂 |
| 调试难度 | 简单 | 简单 | 复杂 | 复杂 |
| 可靠性 | 非常差 | 差 | 高 | 高 |
| 吞吐量 | 低 | 中 | 高 | 高 |