자바 NIO 의 Selector 깊이 이해(선택 기)

이 절 에서 우 리 는 선택 기(selectors)를 탐색 할 것 이다.선택 기 는 준 비 된 작업 을 수행 할 수 있 는 능력 을 제공 하여 다 중 I/O 를 가능 하 게 합 니 다.제1장 에서 설명 한 것 처럼 선택 과 다 원 화 된 실행 으로 인해 단일 스 레 드 가 여러 개의 I/O 채널(channels)을 효율 적 으로 동시에 관리 할 수 있 습 니 다.C/C+코드 의 공구 상자 에는 수년 전부터 select()와 poll()두 개의 POSIX(이식 가능 한 운영 체제 인터페이스)시스템 호출 이 사용 되 었 다.허 과 운영 체제 도 비슷 한 기능 을 제공 하지만 자바 프로그래머 에 게 는 JDK 1.4 가 돼 야 가능 한 방안 으로 기능 을 선택 할 수 있다.
다음은 선택 기 를 사용 합 니 다.
selector.open()방법 을 통 해 선택 기 를 만 들 수 있 습 니 다.

Selector selector = Selector.open();
채널 을 선택 기 에 등록 하기:

channel.configureBlocking(false);

SelectionKey key = channel.register(selector, SelectionKey.OP_READ);
채널 이 Selector 에 등록 하려 면 이 채널 은 반드시 차단 되 지 않 아야 합 니 다.즉,channel.configure Blocking(false)입 니 다.Channel 이 막 히 지 않 으 면 안 되 기 때문에 FileChannel 은 선택 기 를 사용 할 수 없습니다.FileChannel 이 모두 막 히 기 때 문 입 니 다.
채널.register()방법 을 사용 할 때 두 번 째 매개 변 수 는 채널 의 어떤 유형의 이벤트 에 관심 이 있 는 지 지정 합 니 다.이 이벤트 들 은 다음 과 같 습 니 다.
  • Connect,즉 연결 이벤트(TCP 연결),SelectionKey.OP 에 대응CONNECT
  • Accept,즉 사건 확인,SelectionKey.OP 에 대응ACCEPT
  • Read,즉 읽 기 이벤트,SelectionKey.OP 에 대응읽 기,buffer 읽 을 수 있 음 을 표시 합 니 다.
  • Write,즉 이벤트 쓰기,SelectionKey.OP 에 대응WRITE,buffer 가 쓸 수 있 음 을 표시 합 니 다.
  • 하나의 채널 이 하나의 이 벤트 를 보 내 는 것 을 어떤 이벤트 에 대해 채널 이 준비 되 었 다 고 할 수 있 습 니 다.따라서 하나의 채널 이 다른 서버 에 성공 적 으로 연결 되 었 다 고 할 수 있 습 니 다.connect ready 라 고 할 수 있 습 니 다.
    우 리 는 여러 사건 을 조합 하기 위해 사용 하거나 연산 할 수 있 습 니 다.예 를 들 어:
    
    int interestSet = SelectionKey.OP_READ | SelectionKey.OP_WRITE;
    한 채널 은 하나의 Selector 에 한 번 만 등록 할 수 있 습 니 다.만약 에 채널 을 Selector 에 여러 번 등록 하면 사실은 SelectionKey 를 업데이트 하 는 interest set 에 해당 합 니 다.예 를 들 어:
    
    channel.register(selector, SelectionKey.OP_READ);
    channel.register(selector, SelectionKey.OP_READ | SelectionKey.OP_WRITE);
    위의 channel 은 같은 selector 에 두 번 등 록 했 습 니 다.그러면 두 번 째 등록 은 이 채널 을 업데이트 하 는 interest set 에 해당 하 는 selection Key.OP 입 니 다.READ | SelectionKey.OP_WRITE.
    그러나 자바 NIO 의 selector 는 하나의 스 레 드 로 여러 채널 의 입력 을 감청 할 수 있 습 니 다.우 리 는 여러 채널 을 selector 에 등록 한 후에 하나의 스 레 드 로 읽 을 수 있 거나 쓸 수 있 는 상태 에 있 는 channel 을 선택 할 수 있 습 니 다.selector 메커니즘 은 단일 라인 관리 여러 채널 을 쉽게 합 니 다.
    다음 에 우 리 는 완전한 예 를 써 서 selector 의 용법 을 보 겠 습 니 다.
    
    //     
    Selector selector = Selector.open();
    channel.configureBlocking(false);
    //    
    SelectionKey key = channel.register(selector, SelectionKey.OP_READ);
    while(true) {
      //  selector  key     
      int readyChannels = selector.select();
      //  0  ,  0    ,  0      
      if(readyChannels == 0) continue;
      //       key
      Set<SelectionKey> selectedKeys = selector.selectedKeys();
      Iterator<SelectionKey> keyIterator = selectedKeys.iterator();
      while(keyIterator.hasNext()) {
        SelectionKey key = keyIterator.next();
        //            ,                 
        if(key.isAcceptable()) {
          //      ServerSocketChannel   
        } else if (key.isConnectable()) {
          //          .
        } else if (key.isReadable()) {
          //           
        } else if (key.isWritable()) {
          //           
        }
        keyIterator.remove();
      }
    }
    선택 기의 사용 은 아직도 많은 세부 사항 이 있 습 니 다.api 문 서 를 많이 보고 각 방법의 용법 을 알 아야 합 니 다.다음 절 에 종합 연습 을 해서 NIO 의 사용 을 정리 하 겠 습 니 다.
    이상 은 자바 NIO 의 Selector(선택 기)에 대한 상세 한 내용 을 깊이 있 게 이해 하 는 것 입 니 다.자바 nio Selector(선택 기)에 관 한 자 료 는 다른 관련 글 을 주목 하 세 요!

    좋은 웹페이지 즐겨찾기