이 단원에서는 Selector 클래스 에 대해 알아봅니다 . 이 클래스는 java.nio.channels 패키지 에 있으므로 이를 사용하기 위해 아무것도 다운로드하거나 구성할 필요가 없습니다. 선택기 개체는 하나 이상의 채널 개체를 모니터링하고 읽기/쓰기 준비 상태 등을 확인할 수 있습니다. 그리고 가장 중요한 것은 선택기에는 채널당 하나의 스트림이 아니라 하나의 스트림이 필요합니다.

정적 열기 방법을 사용하여 선택기를 만듭니다 .


Selector selector = Selector.open();

그런 다음 선택기 개체에 채널을 등록할 수 있습니다.


SelectionKey key1 = channel1.register(selector, SelectionKey.OP_READ);
SelectionKey key2 = channel2.register(selector, SelectionKey.OP_WRITE);

register 메서드 의 두 번째 매개변수는 선택기가 모니터링할 작업을 결정합니다. 한 번에 여러 작업을 모니터링해야 하는 경우 비트 OR을 사용할 수 있습니다.


SelectionKey.OP_READ | SelectionKey.OP_WRITE

임의의 채널에서 I/O 작업이 발생하면 선택기가 알려줍니다. 예를 들어 이렇게 하면 많은 데이터 소스에서 데이터를 읽을 수 있습니다.

여기에서 채널이 선택기와 함께 사용되려면 채널이 비차단 모드여야 한다는 점을 언급해야 합니다.


channel1.configureBlocking(false);
channel2.configureBlocking(false);
SelectionKey key1 = channel1.register(selector, SelectionKey.OP_READ);
SelectionKey key2 = channel2.register(selector, SelectionKey.OP_WRITE);

FileChannel 은 비차단 모드로 전환 할 수 없기 때문에 선택기가 FileChannel 에서 작동하지 않습니다( configureBlocking 메서드는 FileChannel이 상속하지 않는 SelectableChannel 클래스 에서 선언됨 ).

다이어그램에서 선택기가 소켓과 함께 사용하기에 적합하다는 것을 알 수 있습니다. 두 번째 모듈의 끝에서 그들과 함께 작업할 것입니다.

선택키

선택기로 채널을 등록하면선택키물체. 이 개체에는 채널 등록에 대한 데이터가 포함되어 있습니다.

키를 사용하여 채널이 특정 값에 대해 준비되었는지 확인할 수 있습니다.


key.isReadable()
key.isAcceptable()
key.isConnectable()
key.isWritable()

키는 해당 채널과 선택기를 제공할 수 있습니다.


Channel channel = key.channel();
Selector selector = key.selector();

나중에 키를 추적하기 위해 모든 개체를 키에 연결할 수 있습니다. 이는 채널 등록 중(세 번째 인수를 통해) 또는 나중에 수행할 수 있습니다.

  1. SelectionKey key = channel.register(selector, SelectionKey.OP_ACCEPT, object);

  2. key.attach(객체);

나중에 키에서 연결된 개체를 가져올 수 있습니다.


Object object = key.attachment();

결론

선택기로 채널을 등록한 후 다음을 수행할 수 있습니다.

  • 지정된 작업을 수행할 준비가 된 채널 수 찾기
  • 적어도 하나의 채널이 준비될 때까지 프로그램 실행을 차단합니다.
  • 준비된 채널에 대한 키 세트 가져오기
  • 그리고 더

두 번째 모듈의 끝에서 실제로 선택기를 사용해 볼 것입니다.