当您拥有诸如inputStreamoutputStream之类的流并且使用

stream.read();


它暂停当前线程,直到接收到数据。

我知道可以恢复线程的唯一方法是关闭另一个线程的流,这会引发异常并跳到catch块。

我正在处理套接字,在那里我有一个线程循环并从同级获取数据。
我正在考虑添加一个pauseDataThread()方法,该方法将暂时停止从流中读取数据,直到调用resumeDataThread()为止。但是,它一直停留在那条线上,阻止了我继续执行直到收到另一个数据包。

我可以做些什么来“跳过” stream.read();行而无需实际读取任何数据?

编辑:

@SimoneGianni的建议效果很好,但是除非您在循环中包括“睡眠”(否则可能会降低传输速度),否则它会占用很多CPU周期。

while(!stopThread)
{
      if (inputStream.available() > 0 && !pauseThread)
      {
           fireEvent(inputStream.read());
      } else
      {
           Thread.sleep(50);
      }
}


@EJP的建议也很有效,但设置超时仍然会带来无法立即暂停线程的微小风险(因此,这种情况仍然可能发生):

    > Socket timeout set to 50ms.
     myThread.pause();
    > Client sends data, it arrives in less than 30ms.
    //myThread still fires the event indicating that data was recieved, even though it was
    //paused before.


我正在寻找可以中断线程的解决方案。
这让我思考,中断线程真的很安全吗?它仍会实际读取该行但不触发该事件吗?

最佳答案

您可以通过Socket.setSoTimeout()设置读取超时。但是习惯上有一个线程除了从套接字读取外什么也不做,因此它是否阻塞并不重要。如果还有其他事情要做,请在另一个线程中进行。

关于java - “跳过” Stream.read操作,而无需在Java中关闭流,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6986171/

10-10 10:02