"Skip" Stream.read 操作而不关闭 Java 中的流



当您有一个流,例如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 IO是线程阻塞的,Java nio有非阻塞的原语来读取流。

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

相关内容

  • 没有找到相关文章

最新更新