从套接字等待输入时阻止停止/中断线程

kla*_*han 14 java multithreading

正如标题所说,我需要一种方法来阻止或中断被套接字输入阻塞的线程.

aka*_*okd 12

您可以简单地从另一个线程关闭()IO流/套接字.然后,如果结果IOException由于close或其他原因,您可以检查volatile布尔字段.我认为收盘可能会导致java.net.SocketException: Socket closed例外.

  • 你误解我了.如果你关闭套接字,read()会抛出一个IOException - 在这种情况下是一个SocketException.你已经有了IOException的try-catch.如果使用Thread.interrupt(),则会引发异常.因此,你总是得到一些例外.我建议添加一个标志,表示在读取异常之前有故意取消/关闭尝试. (6认同)
  • 使用Exceptions进行程序流控制是一种非常糟糕的样式,特别是如果它是像"IOException"这样的通用目标,它可能是由除了超时之外的各种事情引起的. (3认同)
  • 在设置标志和调用`close()`之间不能抛出_true_ IOException? (2认同)

Kos*_*801 8

Thread.interrupt()应该是您正在寻找的方法.确保您的输入访问方法还检查InterruptedException和ClosedByInterruptException.

另请参阅Sun Concurrency Tutorial中的相应页面,正如另一个解决方案所示.

  • 不幸的是,Thread.interrupt()对BufferedInputStream.read()没有影响. (32认同)

Dan*_*ler 5

套接字允许通过该setSoTimeout()方法设置超时.这是阻止它们阻止的首选方法.

否则,您可能希望查看nio允许非阻塞I/O 的程序包,但需要花费更多的手动工作来管理传入和传出数据.