Когда у вас есть поток, например 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.
Я ищу решение, которое прервет поток.Это заставило меня задуматься, действительно ли прерывание потока действительно безопасно?Будет ли он на самом деле читать строку, но не запускать событие?