Java中的可中断网络I / O

问题描述 投票:7回答:3

在Java 1.4+中,有3种方法来中断在套接字I / O上阻塞的流:

  1. 如果套接字是使用常规的java.net.Socket(InetAddress, int)构造函数创建的,则可以从单独的线程中进行java.net.Socket(InetAddress, int)。结果,在阻塞的线程中抛出了close it
  2. 如果套接字是使用SocketExceptionSocketException(非阻塞I / O)创建的-再次可以从单独的线程关闭套接字,但是现在抛出了另一个异常(SocketChannel.open(...))在被阻止的线程中。
  3. 另外,在使用非阻塞I / O的情况下,可以抛出SocketChannel.open(...)来中断阻塞的线程。使用旧式Java I / O时中断被阻塞的线程对该线程无效。

问题:

  1. 使用旧式I / O时是否正在从单独的线程thread-safe关闭套接字?如果没有,有哪些替代方案?
  2. 使用NIO时是否从单独的线程thread-safe关闭套接字/通道?
  3. 使用NIO而不是常规IO时socket()行为是否有差异?
  4. 使用NIO进行网络连接有什么好处?[[其他可以通过简单地中断线程来终止被阻止的I / O操作(这样我就不再需要保留对套接字的引用了)?
java multithreading io nio
3个回答
3
投票
使用旧式I / O时是否从单独的线程关闭套接字是线程安全的?如果没有,有哪些替代方案?

是。

[一种替代方法是使用阻塞NIO(这是SocketChannel BTW的默认行为),我希望为少量连接使用此功能,因为它具有NIO的效率,但具有一些普通IO的简单性。

使用NIO时是否从单独的线程关闭套接字/通道是线程安全的?

对于阻塞NIO和无阻塞NIO,它们都是线程安全的。

使用NIO而不是常规IO时Socket.close()行为是否有差异?

如果您需要了解详细信息,我建议您阅读代码,但基本上它们是相同的。

使用NIO进行网络连接除了通过简单地中断线程来终止被阻止的I / O操作之外,还有其他好处吗?]

如何关闭连接是最不用担心的。因此,是的,有很多理由考虑将NIO视为普通IO。

NIO的优点

    使用直接存储时更快更轻巧
  • 可扩展到成千上万的用户。
  • 支持有效的繁忙等待。
  • 缺点

    普通IO易于编写。
  • 出于这个原因,许多API仅支持普通IO。

0
投票
1)由于引发异常的底层OS调用错误来自支持多线程的TCP堆栈,因此应该没有任何问题。

0
投票
聚会晚点,答案已经涵盖了这个话题,但是我想我仍然可以添加一些有用的东西。
© www.soinside.com 2019 - 2024. All rights reserved.