当您拥有诸如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 - “跳过” Stream.read操作,而无需在Java中关闭流,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6986171/