【问题标题】:Interrupting Threads that are blocked, waiting for input from a Socket中断被阻塞的线程,等待来自 Socket 的输入
【发布时间】:2011-12-04 01:48:41
【问题描述】:
当一个线程在阻塞来自 Socket 的InputStream 的输入的同时被中断时,该 Socket 的资源(例如本地端口)是否被释放?
我知道 Socket 有一个名为 SoTimeout 的选项。如果我设置了SoTimeout选项,超时后Socket绑定的端口是否会被释放?
【问题讨论】:
标签:
java
multithreading
sockets
【解决方案1】:
没有什么说Thread.interrupt() 会中断读取,更不用说关闭套接字了,除非它是一个InterruptibleChannel,在这种情况下,语义被明确记录为抛出ClosedByInterruptException 并关闭通道。
如果设置套接字超时并获得SocketTimeoutException,则套接字保持打开状态。它的任何资源都不会被释放(包括它的端口),这意味着在 Socket 关闭之前,您无法将新的 Socket 绑定到该端口。
【解决方案2】:
超时本身既不会关闭 Socket,也不会解除绑定端口。您需要致电 socket.close() 来完成此操作。