如果我只是替换
,会出现什么问题socket = new Socket()
与
socket = SocketChannel.open().socket()?
背景:我使用new Socket()
有一些遗留代码,我希望能够中断socket.connect()
调用。我不想重写代码来使用NIO。我了解到Thread.interrupt()
不会中断socket.connect()
,但是另一个线程上的socket.close()
应该会中断连接。奇怪的是,这适用于Java 7但不适用于Java 6.
我在某种程度上明白,使用socket = SocketChannel().open().socket()
会让我使用Thread.interrupt()
来中断socket.connect()
。它没有,但奇怪的是,它确实在Java 6中使socket.close()
中断socket.connect()
!
请注意,我不是以任何方式直接使用附加的SocketChannel
- 它会在我创建Socket
时出现,而不会再出现。
这会出现什么问题?
答案 0 :(得分:2)
有几个。
为什么要中断connect()调用?当然你想要的只是一个连接超时?
答案 1 :(得分:0)
抛出异常类型的差异可能会破坏现有代码。
例如,在Socket
阻止时从其他线程关闭Socket.getInputStream().read()
将导致替换后AsynchronousCloseException,而不是遗留代码可能期望的SocketException
。 (AsynchronousCloseException
不是SocketException
的子类。)
但是,如果其他帖子的关闭在Socket.getInputStream().read()
之前进入,SocketException
仍会抛出read()
。