当您有一个流,例如inputStream
或outputStream
,并且您使用
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()方法提前知道是否有字节要读取