isconnectionpending()用于判断连接是否挂起,finishconnect()用于确认连接成败并收尾;前者仅查询状态,后者才真正完成连接或抛异常,二者配合构成非阻塞连接闭环。

isConnectionPending() 和 finishConnect() 是 Java NIO 中实现非阻塞 Socket 连接的关键配合方法,它们共同构成异步连接的“闭环”逻辑——即从发起连接请求,到确认连接建立完成的完整状态流转。
isConnectionPending():判断是否处于连接进行中
该方法返回 true 表示已调用 connect() 但连接尚未完成(例如 TCP 三次握手未结束),此时通道处于“连接挂起”状态。它不触发任何 I/O 操作,仅查询内部状态。
典型使用场景:
- 在 Selector 的 OP_CONNECT 事件就绪时,先调用它确认是否真为连接完成事件(避免误判其他就绪类型);
- 在轮询模式下(未注册 Selector),可配合
Thread.sleep()等待连接结果,但不推荐; - 注意:即使返回 false,也不代表连接失败,可能根本没调用过
connect(),或连接已成功/失败并进入正常读写状态。
finishConnect():收尾连接操作并反馈结果
该方法尝试完成底层连接过程。若连接已就绪,它立即返回 true;若仍在进行中,返回 false;若连接失败(如拒绝连接、超时),则抛出相应的 IOException(如 ConnectException)。
关键点:
- 必须在
isConnectionPending()返回 true 后,或收到 OP_CONNECT 就绪通知后调用; - 调用一次即可,重复调用在连接完成后始终返回 true;
- 它是真正“确认连接成败”的唯一可靠方式——不能仅靠 isConnectionPending() 判断成功与否。
闭环协作流程(Selector 场景)
标准异步连接闭环如下:
- 设置 SocketChannel 为非阻塞,调用
connect(new InetSocketAddress(...)); - 若返回 false(表示连接未立即完成),将通道注册到 Selector,关注
SelectionKey.OP_CONNECT; - 当 Selector 返回该 key 就绪,先调用
isConnectionPending()确保是连接事件; - 再调用
finishConnect():成功则切换至 OP_READ 注册,失败则关闭通道并处理异常。
常见误区与注意事项
容易忽略的细节:
-
isConnectionPending()不是线程安全的“等待器”,它不阻塞也不重试,只是快照; - 未调用
finishConnect()就直接读写,会抛出NotYetConnectedException; - 连接失败后,
finishConnect()抛异常,通道仍处于未连接状态,需显式关闭; - 某些操作系统(如 Linux)在连接被拒时可能不会立即通知 OP_CONNECT 就绪,导致延迟感知失败,建议设置合理的超时机制(如定时检查 + 计数)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











