在 Java 1.4+ 中,有 3 种方法可以中断在套接字 I/O 上阻塞的流:
- 如果套接字是使用常规
java.net.Socket(InetAddress, int)
构造函数创建的,我可以从单独的线程中关闭它。结果,SocketException
在阻塞的线程中抛出了 a 。 - 如果套接字是使用
SocketChannel.open(...)
.socket()
(非阻塞 I/O)——同样,可以从单独的线程中关闭它,但现在AsynchronousCloseException
在阻塞的线程中会抛出一个不同的异常(an)。 - 此外,在使用非阻塞 I/O 的情况下,可以通过 throw 中断阻塞的线程
ClosedByInterruptException
。使用旧式 Java I/O 时中断阻塞的线程对线程没有影响。
问题:
- 使用旧式 I/O 时是否从单独的线程线程安全地关闭套接字?如果没有,有什么替代方案?
- 使用 NIO 时是否从单独的线程线程安全地关闭套接字/通道?
Socket.close()
与常规 IO 相比,使用 NIO 时的行为有什么不同吗?- 除了可以通过简单地中断线程来终止阻塞的 I/O 操作(这样我不再需要保留对套接字的引用)之外,使用 NIO 进行网络还有什么好处?