Akashic Records

자바 nio - 13 본문

오래된글/Java

자바 nio - 13

Andrew's Akashic Records 2018. 4. 9. 12:50
728x90

13. Selector 클래스와 SelectionKey 클래스

java.nio.channels.Selector 클래스는 SelectableChannel(채널)들을 관리하는 클래스로서 SelectionKey의 인스턴스로 관리한다. 이런 채널들을(엄밀히 말하면 SelectableChannel클래스) 관리하는 것이 바로 Selector 클래스의 역활이다. Selector가 관리하는 SelectableChannel들은 전부 non-blocking I/O모드이어야 하며 blocking I/O모드의 채널은 Selector에 의해 관리되지 못한다.

java.nio.channels.SelectionKey 클래스는 SelectableChannel 을 선택하는데 기준이 되는 동작(ops)과 부가적인 정보 객체(att)와 이에 연결된 Selector를 함께 표현하는 클래스로 SelectableChannel를 다루는데 있어 기본적인 정보 클래스이다.

그럼 Selector, SelectableChannel, SelectionKey 클래스 이들 관계에 대해서 그림을 보면 좀더 이해가 쉬울것이다.

그림을 살펴보면 우선 채널들이 selector에 등록이 된다. 등록된 채널들은 해당 입출력 동작이 일어날때마다 selector에 의해 선택되어서 실행이 된다. 따라서 스레드는 selector만 감시하면 나머지는 selector가 다하게 되는 것이다.


1. Selector 클래스의 주요 메서드

-  public static Selector open () : selector를 얻는다. 예를 들면 다음과 같다.

Selector s=Selector.open();

-  public abstract void close () : selector를 닫는다. 이때 selector가 관리중인 SelectionKey들도 모두 닫힌다.

-  public abstract boolean isOpen () : selector가 닫혔는지 아닌지 여부를 리턴.

-  public abstract Set keys () : 채널이 등록될때 생성된 SelectionKey를 java.util.Set객체로 리턴한다. 이 Set안에 SelectionKey들이 전부 들어 있다.

-  public abstract Set selectedKeys () : selector가 선택한 SelectionKey를 java.util.Set객체로 리턴한다. 이들은 등록된 SelectionKey들 중에서 해당 동작(ops)이 일어난 SelectionKey들을 가리키는 것이다. 이들은 select()메서드나 selectNow()메서드가 호출된 다음에 Set 객체에 채워진다.

-  public abstract int select () :

-  public abstract int selectNow () :

-> 둘다 등록된 SelectionKey들 중에서 해당 동작(ops)이 일어난 SelectionKey들을 SelectionKey 리스트에 포함시키는 메서드로서 실제 해당 동작이 일어난 SelectionKey의 개수를 리턴한다. 이 둘의 차이점은 우선 select()인 경우 해당 동작이 일어난 SelectionKey가 하나라도 생시지 않으면 그 상태에서 블로킹이 된다. 그러나 selectNow()는 당장 해당 동작이 일어난 SelectionKey가 없어도 곧바로 리턴이 된다.

-  public abstract Selector wakeup () : select()가 블로킹되었을때 이를 깨워주는 메서드이다. 이때 SelectionKey의 Set에 SelectionKey가 추가되었는지 안되었는지는 알 수 없다.


2. SelectionKey 클래스의 주요 메서드

우선 클래스 변수부터 살펴보자. 앞서 말했지만 이들은 입출력 동작의 종류을 나타낸다.

  • public static final int OP_ACCEPT

  • public static final int OP_CONNECT

  • public static final int OP_READ

  • public static final int OP_WRITE

이들은 각각 비트값을 가진 int형 데이터로서 각각이 or연산에 의해 합해져서 어떤 동작들이 가능하거나 관심 있는지를 나타내게 된다.

-  public abstract int interestOps () : 해당 동작을 위의 값들로 리턴한다. 예를 들어 OP_READ|OP_WRITE 값이 리턴되었다면 읽는 것과 쓰는 동작을 취한다는 뚯이 된다. 그래서 읽거나 쓰거나 하는 동작이 취해지면 Selector에 의해 선택될 수 있게 된다.

-  public abstract SelectionKey interestOps (int ops) : 이는 위와는 반대로 해당 동작을 지정한다.

-  public final boolean isAcceptable ()

-  public final boolean isConnectable ()

-  public final boolean isReadable ()

-  public final boolean isWritable ()

: 이들 메서드는 해당 동작들의 유효성을 점검할 수 있다.

잠깐!.. 현재 일어나는 해당 동작 알아내기!!

두가지 방법이 있는데 우선 readyOps ()메서드를 사용하는 방법이다. readyOps ()는 현재 준비가 가능한 동작들을 int형으로 리턴해 준다. 따라서 int값을 얻어서 이를 하나하나 비트값을 조사한다. 이는 하나의 동작일 수도 있고 여러개의 동작일 수도 있다. 예를 들어, 읽기인 경우...다음과 같이 비교한다.

k.readyOps() & OP_READ != 0

하지만 이 방법보다는 isAcceptable ()/ isConnectable ()/ isReadable () / isWritable () 이들 메서드를 이용해서 검사하는 것이 편하다.


-  public final Object attach (Object ob) : 채널 등록시 함께 등록될 객체(채널에 관한 정보를 담고 있는 객체)를 지정해준다. 이는 SelectableChannel클래스의 register ()메서드에서 인자 하나를 추가해서 지정해주는 것과 같다.

-  public final Object attachment () : attach()메서드나 register()로 추가로 지정된 객체를 리턴한다.

-  public abstract SelectableChannel channel () : 연결된 SelectableChannel 인스턴스를 리턴한다.

-  public abstract Selector selector () : 연결된 Selector 인스턴스를 리턴한다.

728x90

'오래된글 > Java' 카테고리의 다른 글

JMS - 기초  (0) 2018.04.09
자바 nio - 14  (0) 2018.04.09
자바 nio - 12  (0) 2018.04.09
자바 nio - 11  (0) 2018.04.09
자바 nio - 10  (0) 2018.04.09
Comments