正如标题所说,我需要一种方法来阻止或中断被套接字输入阻塞的线程。
答案 0 :(得分:12)
您可以简单地从另一个线程关闭()IO流/套接字。然后,如果结果IOException由于close或其他原因,您可以检查volatile布尔字段。我认为收盘可能会导致java.net.SocketException: Socket closed
例外。
答案 1 :(得分:8)
Thread.interrupt()应该是您正在寻找的方法。 确保您的输入访问方法还检查InterruptedException和ClosedByInterruptException。
另请参阅相应的page in the Sun Concurrency Tutorial,正如另一种解决方案所暗示的那样。
答案 2 :(得分:5)
套接字允许通过setSoTimeout()
方法设置超时。这是阻止它们阻止的首选方法。
否则,您可能需要查看允许非阻塞I / O的nio
程序包,但需要花费更多的手动工作来管理传入和传出数据。
答案 3 :(得分:4)
我没有看到socket.closeInput()
。但是,我找到了socket.shutdownInput()
。在调用之后(从一个自然阻塞的不同线程),我对bufferedReader.close()
的调用工作正常! (我跟着调用了printWriter.close()
和socket.close()
。
答案 4 :(得分:1)
尝试使用sock.closeInput(),然后使用sock.close()
答案 5 :(得分:0)
关闭套接字,读取将被解除阻塞(将以IOException的子类退出)。读取对Thread.interrupt的响应取决于平台(例如,在Solaris 10上不起作用)。