Nice programing

소켓 IO 작업에서 스레드 차단을 즉시 종료하는 방법은 무엇입니까?

nicepro 2020. 11. 15. 11:43
반응형

소켓 IO 작업에서 스레드 차단을 즉시 종료하는 방법은 무엇입니까?


Java의 맥락에서 GUI 창을 열 때 네트워크 입력을 읽는 새 스레드를 만들고 창을 닫으면 소켓 리소스를 해제하고 스레드를 즉시 종료하고 싶습니다. 이제 setSoTimeout 메서드를 사용하고 있지만 시간 초과 예외를 기다리고 싶지 않습니다. 아무도 제안을 할 수 있습니까? 감사!


이를 수행하는 방법에는 (잠재적으로) 세 가지가 있습니다.

  • Socket.close()소켓에서 호출 하면 연결된 개체 InputStreamOutputStream개체 가 닫히고 Socket 또는 (연결된) 스트림 작업에서 차단 된 모든 스레드가 차단 해제됩니다. javadoc에 따르면 소켓 자체에 대한 작업은 SocketException.

  • 호출 Thread.interrupt()은 (지정되지 않은 일부 상황에서) 차단 I / O 작업을 중단하여 InterruptedIOException.

    주의 사항에 유의하십시오. 분명히 "interrupt ()"접근 방식은 "대부분의"최신 Java 플랫폼에서 작동하지 않습니다. (다른 사람이 시간과 성향이 있다면이 접근 방식이 작동하는 상황을 조사 할 수 있습니다. 그러나 행동이 플랫폼에 따라 다르다는 사실만으로도 애플리케이션이 필요한 경우에만 사용해야한다는 사실만으로도 충분합니다. 특정 플랫폼에서 작업 할 수 있습니다. 어느 시점에서 스스로 쉽게 "시도"할 수 있습니다.)

  • 이를 수행하는 세 번째 방법은 Socket.shutdownInput()및 / 또는 을 호출하는 것 Socket.shutdownOutput()입니다. javadocs는 현재 차단 된 읽기 및 / 또는 쓰기 작업에서 어떤 일이 발생하는지 명시 적으로 말하지 않지만 차단을 해제하고 예외를 throw 할 것이라고 생각하는 것은 합리적이지 않습니다. 그러나 javadoc이 무슨 일이 발생하는지 말하지 않으면 동작은 플랫폼에 따라 다르다고 가정해야합니다.


나는이 질문이 오래되었다는 것을 알고 있지만 아무도 Thread.interrupt()"현대 플랫폼" 의 "수수께끼"를 풀지 않은 것 같아서 몇 가지 조사를했습니다.

이것은 Windows7 (64 비트)의 Java 8에서 테스트되었지만 다른 플랫폼에서도 마찬가지입니다.

호출 Thread.interrupt()않습니다 하지 가 발생하는 것은 InterruptedIOException무엇 발생하면 때문이다 InputStream.read()메소드가 리턴과 -1Thread.interrupted()-flag 설정됩니다.

따라서 다음은 '수정 된'read () 던지는 것으로 간주 될 수 있습니다 InterruptedIOException.

static final int read(Socket socket, byte[] inData) 
    throws SocketTimeoutException, // if setSoTimeout() was set and read timed out
           InterruptedIOException, // if thread interrupted
           IOException             // other erors
{
    InputStream in = socket.getInputStream();

    int readBytes = in.read( inData, 0, inData.length);

    if  ( Thread.interrupted() )
    {
        throw new InterruptedIOException( "Thread interrupted during socket read");
    }

    return readBytes;
}

참고 URL : https://stackoverflow.com/questions/4425350/how-to-terminate-a-thread-blocking-on-socket-io-operation-instantly

반응형