inputStream
또는 outputStream
과 같은 스트림이 있고Java에서 스트림을 닫지 않고 Stream.read 작업을 "건너 뜁니다."
stream.read();
데이터를 수신 할 때까지 현재 스레드를 일시 중지합니다.
스레드를 다시 시작할 수있는 유일한 방법은 다른 스레드에서 스트림을 닫는 것입니다.이 스레드는 예외를 발생시키고 catch 블록으로 건너 뜁니다.
소켓을 다루고 있습니다. 여기서 스레드를 가지고 루프에서 데이터를 가져옵니다. resumeDataThread()
resumeDataThread()
메서드를 추가하여 resumeDataThread()
이 호출 될 때까지 일시적으로 스트림에서 데이터를 읽는 것을 중지하는 방법을 생각 중이었습니다. 그러나 그것은 다른 패킷을 수신 할 때까지 그렇게하지 못하게하는 그 행에 붙어 있습니다.
실제로 데이터를 읽지 않고 stream.read();
행을 건너 뛸 수있는 방법이 있습니까?
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.
스레드를 인터럽트 할 솔루션을 찾고 있습니다. 이것은 나에게 생각이 떠올랐다. 실을 아주 방해하지 않습니까? 그것은 여전히 실제로 라인을 읽지 만 행사를 시작하지 않을까요?
글쎄, 내 유일한 옵션은 어쨌든 그 줄을 읽고 나중에 스레드를 중지하는 것 같습니다 ... – David
아니요. 최근에 비슷한 문제가 발생했습니다. 차단을 원하지 않으면 NIO를 사용해야합니다. 어떤 이유로 든 할 수 없다면 가장 좋은 방법은 일부 제어 스레드가 사용중인 스레드를 인터럽트하여 읽는 것입니다. 전체 프로그램을 막지 않으려면 수신 대기중인 각 소켓에 스레드를 할당하십시오. – Vort3x