“跳过”Stream.read操作而不关闭Java中的流

时间:2011-08-08 17:38:19

标签: java sockets stream

如果您有一个流,例如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.

我正在寻找一种能够打断线程的解决方案。 这让我想到了,中断线程真的安全吗?它是否仍会实际读取该行但不会触发该事件?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

普通Java IO是线程阻塞的,Java nio具有非阻塞原语,用于从流中读取。

但是,您可以使用InputStream的available()方法预先知道是否有要读取的字节。