【发布时间】:2012-03-28 20:03:21
【问题描述】:
我正在开发服务器-客户端应用程序,但在等待输入流上的输入数据时遇到问题。
我有专门用于读取输入数据的线程。目前它使用 while 循环来保持直到数据可用。 (NB协议如下:发送数据包的大小,比如N,作为int然后发送N字节)。
public void run(){
//some initialization
InputStream inStream = sock.getInputStream();
byte[] packetData;
//some more stuff
while(!interrupted){
while(inStream.available()==0);
packetData = new byte[inStream.read()];
while(inStream.available()<packetData.length);
inStream.read(packetData,0,packetData.length);
//send packet for procession in other thread
}
}
它可以工作,但通过 while 循环阻塞线程是 IMO 一个坏主意。我可以使用 Thread.sleep(X) 来防止资源被循环不断消耗,但肯定有更好的方法。
我也不能依赖 InputStream.read 来阻塞线程,因为服务器可能会延迟发送部分数据。我尝试过,但总是导致意外行为。
我会很感激任何想法 :)
【问题讨论】:
-
InputStream.read 在数据不可用时已经阻塞。所以放弃
available方法。