2011-08-08 4 views
0

inputStream 또는 outputStream과 같은 스트림이 있고Java에서 스트림을 닫지 않고 Stream.read 작업을 "건너 뜁니다."

을 사용하는 경우
stream.read(); 

데이터를 수신 할 때까지 현재 스레드를 일시 중지합니다.

스레드를 다시 시작할 수있는 유일한 방법은 다른 스레드에서 스트림을 닫는 것입니다.이 스레드는 예외를 발생시키고 catch 블록으로 건너 뜁니다.

소켓을 다루고 있습니다. 여기서 스레드를 가지고 루프에서 데이터를 가져옵니다. resumeDataThread()resumeDataThread() 메서드를 추가하여 resumeDataThread()이 호출 될 때까지 일시적으로 스트림에서 데이터를 읽는 것을 중지하는 방법을 생각 중이었습니다. 그러나 그것은 다른 패킷을 수신 할 때까지 그렇게하지 못하게하는 그 행에 붙어 있습니다.

실제로 데이터를 읽지 않고 stream.read(); 행을 건너 뛸 수있는 방법이 있습니까?

편집 :

@SimoneGianni의 제안은 훌륭하게 작동하지만 루프에 "sleep"을 포함시키지 않으면 (전송 속도가 느려질 수 있음) 상당한 CPU주기를 소비합니다.

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. 

스레드를 인터럽트 할 솔루션을 찾고 있습니다. 이것은 나에게 생각이 떠올랐다. 실을 아주 방해하지 않습니까? 그것은 여전히 ​​실제로 라인을 읽지 만 행사를 시작하지 않을까요?

+0

글쎄, 내 유일한 옵션은 어쨌든 그 줄을 읽고 나중에 스레드를 중지하는 것 같습니다 ... – David

+0

아니요. 최근에 비슷한 문제가 발생했습니다. 차단을 원하지 않으면 NIO를 사용해야합니다. 어떤 이유로 든 할 수 없다면 가장 좋은 방법은 일부 제어 스레드가 사용중인 스레드를 인터럽트하여 읽는 것입니다. 전체 프로그램을 막지 않으려면 수신 대기중인 각 소켓에 스레드를 할당하십시오. – Vort3x

답변

2

Socket.setSoTimeout()을 통해 읽기 시간 초과를 설정할 수 있습니다. 그러나 소켓에서 아무것도 읽지 않는 스레드를 갖는 것이 일반적입니다. 따라서 스레드가 차단되는지는 중요하지 않습니다. 할 일이 있다면 다른 스레드에서 해보십시오.

+0

메인 스레드에서 오랫동안 실행중인 차단 작업을 수행하지 않는 것이 좋습니다. 내가 주 스레드에서 오랫동안 실행중인 블로킹 코드를 수행하는 것이 어디에 좋은지 생각할 수있는 유일한 상황은 배치 프로그램에 있지만 데이터를 기다리는 스레드의 원래 문제는 더 이상 문제가되어서는 안됩니다. – Hyangelo

+0

@EJP 어떻게 스레드를 중단시킬 수 있습니까? – David

+0

@David Thread.interrupt()하지만 내 책에서는 스레드를 전혀 인터럽트하지 않습니다. 왜 당신이 나에게 묻고 있는지 나는 모른다 : 나는 그것을 추천하지 않았고, 나는 당신에게 더 우수한 해결책을 주었다. – EJP

1

일반 Java IO는 스레드 차단이며, Java nio는 스트림에서 읽기 용 기본이 아닌 기본 요소를가집니다.

그러나 읽을 수있는 바이트가 있는지 여부를 미리 알기 위해 InputStream의 available() 메서드를 사용할 수 있습니다.

+0

+1 제안. – David

관련 문제