configureblocking(false) 必须在通道创建后、注册 selector 前且仅调用一次,成功后不可恢复阻塞模式;所有 selectablechannel 默认阻塞,非阻塞是注册 selector 的硬性前提,重复调用或注册后修改会抛异常。

必须在通道创建后、首次调用 configureBlocking(false) 时设置,且仅允许一次;一旦设为非阻塞,不可再切回阻塞模式。
configureBlocking(false) 是唯一入口
所有继承自 SelectableChannel 的通道(如 SocketChannel、ServerSocketChannel、DatagramChannel)默认都是阻塞的。要用于 Selector,必须显式调用:
-
channel.configureBlocking(false)—— 这是启用非阻塞 I/O 的强制步骤 - 该方法只能成功调用一次;重复调用(尤其是设为
true)会抛IllegalBlockingModeException - 未注册、未关闭、未执行过任何 I/O 的“干净”通道才允许这次设置
必须在 register() 之前完成
非阻塞是注册到 Selector 的硬性前提,不是可选项:
- 若先
register()再调configureBlocking(false),会立即抛异常 - 若通道已注册,再尝试修改阻塞模式,JVM 直接拒绝,因底层
epoll/kqueue只接受非阻塞 fd - 典型安全顺序:open → configureBlocking(false) → bind / connect → register
如何验证和配合使用
设置后建议主动确认状态,并确保后续操作符合非阻塞语义:
- 用
channel.isBlocking()检查是否生效(应返回false) - 读写操作需自行处理
0返回值(如write()返回 0 表示内核缓冲区满,不能当作错误) - 配合
Selector时,只在真正需要时注册OP_WRITE,避免虚假就绪
不复杂但容易忽略
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











