Я разрабатываю клиент-серверное приложение, и у меня возникла проблема с ожиданием входных данных во входном потоке.
У меня есть поток, посвященный чтению входных данных. В настоящее время он использует цикл 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.чтение для блокировки потока, так как часть данных может быть отправлена сервером с задержками. Я пытался, но это всегда приводило к неожиданному поведению.
Буду признателен за любые идеи :)