标准答案
- 阻塞 IO 代码简单,配合有界线程或虚拟线程可以处理许多业务场景。
- NIO Selector 适合少量线程管理大量非阻塞连接,但状态机和缓冲处理更复杂。
- 异步 API 适合需要非阻塞完成通知的场景,但取消、部分读写和异常传播要明确。
- 文件 I/O、网络 I/O 和业务线程池要分开观察,不能仅凭 API 名称判断性能。
题目解析
阻塞 IO 代码简单,配合有界线程或虚拟线程可以满足很多服务;NIO/异步 I/O 的价值在于少量执行单元管理大量等待连接,但状态机、Buffer、部分读写和取消都更复杂。
非阻塞 API 只说明调用不会一直占住当前线程,不保证网络更快、下游更快或业务更简单。文件 I/O、连接池和业务线程仍可能成为瓶颈。
Selector 线程只应做快速事件处理和任务投递,不能执行复杂计算或阻塞数据库。压测要观察事件循环延迟、连接数、吞吐、P99 和内存,而不是只比较 API 名称。
常见误区
- 误区:NIO 一定比阻塞 IO 快。改正:按连接规模、阻塞边界、团队复杂度和真实 profile 选型。
- 误区:非阻塞读取不处理半包。改正:维护 Buffer 和读取状态,直到协议层确认一条完整消息。
- 误区:Selector 线程执行复杂业务。改正:把阻塞或长计算转移到有界执行器,保护事件循环。