如果您有一个流,例如inputStream
或outputStream
并且您使用
stream.read();
它会暂停当前线程,直到收到数据。
我知道可以恢复线程的唯一方法是从另一个线程关闭流,这会触发异常并跳转到catch块。
我正在处理套接字,我有一个循环并从对等端获取数据的线程。
我正在考虑添加一个pauseDataThread()
方法,该方法会暂时停止从流中读取数据,直到调用resumeDataThread()
为止。然而,它停留在那条线上,阻止我这样做,直到它收到另一个数据包。
我有什么办法可以“跳过”stream.read();
行而不实际读取任何数据吗?
修改
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.
我正在寻找一种能够打断线程的解决方案。 这让我想到了,中断线程真的安全吗?它是否仍会实际读取该行但不会触发该事件?
答案 0 :(得分:2)
您可以通过Socket.setSoTimeout()设置读取超时。但是习惯上有一个线程除了从套接字读取之外什么都不做,所以它阻塞它并不重要。如果您还有其他事情要做,请在另一个主题中执行。
答案 1 :(得分:1)
普通Java IO是线程阻塞的,Java nio具有非阻塞原语,用于从流中读取。
但是,您可以使用InputStream的available()方法预先知道是否有要读取的字节。