자바

자바 NIO TCP 블로킹과 인터럽트

알통몬_ 2017. 4. 20. 09:59
반응형


안녕하세요 알통몬입니다.

공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^

 


블로킹과 인터럽트

IO 의 Socket 에서는 입력 스트림의 read() 와 write()로 인해서 작업 스레드가 블로킹 되었을 경우

다른 스레드가 작업스레드의 interrupt()를 호출하더라도 블로킹 상태가 풀리지 않습니다.

그랫서 Socket의 close()를 호출하여 SocketException을 발생시켜야 합니다.


NIO의 SocketChannel 의 경우 read() 와 write() 로 인하여 작업 스레드가 블로킹이 되었을 경우

다른 스레드가 작업 스레드의 interrupt()를 호출하면 ClosedByInterruptException이 발생하고

SocketChannel은 즉시 닫히고 블로킹 상태가 풀립니다.

close()를 호출하여 SocketChannel을 닫을 수도 있습니다.

AsynchronousCloseException이 발생되면서 블로킹 상태가 풀립니다.


예제)

 Thread thread = null;

public void receive() {
    thread = new Thread() {
      @Override

      public void run() {

            try {

               .......

              int count = socketChannel.read( byteBuffer );

           } catch ( Exception e ) {

                 socketChannel.close():

           }

      };

      thread.start();

}

public void stop() {

        thread.interrupt();

}


이상입니다.

이번 포스팅은 짧게 끝났네요 ㅎㅎ

다음 포스팅에서는 TCP 넌블로킹 채널에 대해 공부하도록 하겠습니다.

반응형