Java InputStream ожидает данных.

Я разрабатываю клиент-серверное приложение, и у меня возникла проблема с ожиданием входных данных во входном потоке.

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

Буду признателен за любые идеи :)

10
задан Bart Platak 12 March 2012 в 12:12
поделиться