在Java 1.4+中,有3种方法来中断在套接字I / O上阻塞的流:
java.net.Socket(InetAddress, int)
构造函数创建的,则可以从单独的线程中进行java.net.Socket(InetAddress, int)
。结果,在阻塞的线程中抛出了close it。SocketException
。SocketException
(非阻塞I / O)创建的-再次可以从单独的线程关闭套接字,但是现在抛出了另一个异常(SocketChannel.open(...)
)在被阻止的线程中。SocketChannel.open(...)
来中断阻塞的线程。使用旧式Java I / O时中断被阻塞的线程对该线程无效。问题:
socket()
行为是否有差异?使用旧式I / O时是否从单独的线程关闭套接字是线程安全的?如果没有,有哪些替代方案?
是。
[一种替代方法是使用阻塞NIO(这是SocketChannel BTW的默认行为),我希望为少量连接使用此功能,因为它具有NIO的效率,但具有一些普通IO的简单性。
使用NIO时是否从单独的线程关闭套接字/通道是线程安全的?
对于阻塞NIO和无阻塞NIO,它们都是线程安全的。
使用NIO而不是常规IO时Socket.close()行为是否有差异?
如果您需要了解详细信息,我建议您阅读代码,但基本上它们是相同的。
使用NIO进行网络连接除了通过简单地中断线程来终止被阻止的I / O操作之外,还有其他好处吗?]如何关闭连接是最不用担心的。因此,是的,有很多理由考虑将NIO视为普通IO。
NIO的优点