«Пропустить» операцию Stream.read, не закрывая поток в Java - PullRequest
0 голосов
/ 08 августа 2011

Когда у вас есть поток, например inputStream или outputStream, и вы используете

stream.read();

Он приостанавливает текущий поток до получения данных.

Я знаю, что можно возобновить поток, чтобы закрыть поток из другого потока, который запускает исключение и переходит к блоку catch.

Я имею дело с сокетами, где у меня есть поток, который зацикливается и получает данные от однорангового узла.Я думал о добавлении метода pauseDataThread(), который временно останавливал бы чтение данных из потока до вызова resumeDataThread().Однако он застрял в этой строке, не давая мне делать это, пока он не получит другой пакет.

Могу ли я что-нибудь сделать, чтобы "пропустить" строку stream.read(); без фактического чтения каких-либо данных?

Редактировать:

@ Предложение SimoneGianni прекрасно работает, но оно съедает довольно много циклов ЦП, если вы не включите в цикл «спящий режим» (который может снизить скорость передачи).

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.

Я ищу решение, которое прервет поток.Это заставило меня задуматься, действительно ли прерывание потока действительно безопасно?Будет ли он на самом деле читать строку, но не запускать событие?

Ответы [ 2 ]

2 голосов
/ 09 августа 2011

Вы можете установить тайм-аут чтения через Socket.setSoTimeout (). Но обычно есть поток, который ничего не делает, кроме чтения из сокета, поэтому не имеет значения, блокируется ли он. Если вам есть чем заняться, делайте это в другой ветке.

1 голос
/ 09 августа 2011

Обычный Java IO является блокирующим поток, Java nio имеет неблокирующие примитивы для чтения из потоков.

Однако вы можете использовать метод inputStream (), чтобы заранее знать, есть ли байты для чтения или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...