JavaTM Platform
Standard Ed. 6

java.nio.channels
클래스 Selector

java.lang.Object 
  상위를 확장 java.nio.channels.Selector
직계의 기존의 서브 클래스:
AbstractSelector


public abstract class Selector
extends Object

SelectableChannel 객체의 멀티플렉서입니다.

셀렉터를 작성하려면 , 이 클래스의 open 메소드를 호출합니다. 이 메소드는, 시스템의 디폴트셀렉터 프로바이더 를 사용해 새로운 셀렉터를 작성합니다. 커스텀 셀렉터 프로바이더의 openSelector 메소드를 호출해도, 셀렉터를 작성할 수 있습니다. 셀렉터는,close 메소드로 클로즈 될 때까지 오픈 상태를 유지합니다.

SelectionKey 객체는, 선택 가능 채널이 셀렉터에 등록되어 있는 것을 나타냅니다. 셀렉터는 선택 키의 3 개세트를 관리합니다.

새롭게 작성된 셀렉터에서는, 이 3 개세트는 빈 상태(empty)입니다.

채널의 register 메소드를 사용해 채널을 등록하면(자), 그 부작용으로서 셀렉터의 키 세트에 키가 추가됩니다. 삭제된 키는, 선택시에 키 세트로부터 삭제됩니다. 키 세트 자체를 직접 변경할 수 없습니다.

채널의 클로즈나 cancel 메소드의 호출에 의해 키를 취소하면(자), 이 키가 셀렉터의 삭제된 키 세트에 추가됩니다. 키를 취소하면(자), 다음의 선택시에 채널의 등록이 해제됩니다. 삭제된 키는, 이 시점에서, 모든 셀렉터의 키 세트로부터 삭제됩니다.

키는, 선택 조작에 의해 선택된 키 세트에 추가됩니다. 선택된 키 세트로부터 직접 키를 삭제하고 싶은 경우는, 이 키 세트의 remove 메소드를 호출하는지, 이 세트로부터 취득 가능한반복자remove 메소드를 호출합니다. 그 이외의 방법으로, 선택된 키 세트로부터 키를 삭제할 수 없습니다. 선택의 부작용으로서 키가 삭제될 것은 없습니다. 또, 선택된 키 세트에 직접 키를 추가할 수도 있습니다.

선택

선택마다, 셀렉터의 선택된 키 세트에 키가 추가되거나 키 세트나 삭제된 키 세트로부터 키가 삭제 되거나 합니다. 선택은,select() ,select(long) ,selectNow() 의 몇개의 메소드에 의해, 다음의 3 단계의 순서를 거쳐 행해집니다.

  1. 삭제된 키 세트에 포함되는 모든 키가 각 키 세트로부터 삭제되어 채널의 등록이 해제됩니다. 이 순서에 의해, 삭제된 키 세트는 비웁니다.

  2. 선택 조작이 개시된 시점에서, 키의 대상 세트에 나타나고 싶은 차이인가의 조작을 실행할 수 있는 상태의 채널이 갱신되었는지 어떠했는지에 임해서, 기본이 되는 operating system가 조회됩니다. 해당하는 채널에 대해서는, 다음의 몇개의 액션이 실행됩니다.

    1. 선택된 키 세트로부터 삭제된 채널의 키가 세트에 추가되어 현재 이 채널로 실행 가능한 조작을 알 수 있도록(듯이) 실행 가능 조작 세트가 변경됩니다. 그 이전에 실행 가능 세트에 기록된 정보는 파기됩니다.

    2. 그 이외의 경우, 채널의 키는 벌써 선택된 키 세트내에 있습니다. 따라서, 실행 가능 조작 세트는, 채널을 실행할 수 있는 새로운 조작을 알 수 있도록(듯이) 변경됩니다. 그 이전에 실행 가능 세트에 기록된 정보는 보존됩니다. 즉, 기본이 되는 시스템으로부터 반환되는 실행 가능 세트는, 비트 단위로 현재의 실행 가능 세트 로 분리됩니다.

  3. 이 순서의 개시시에, 키 세트내의 모든 키의 대상 세트가 비우고 있는 경우, 선택된 키 세트도 키의 실행 가능 조작 세트도 갱신되지 않습니다.
  4. 순서 2 의 실행중에 삭제된 키 세트에 추가된 키는, 순서 1 에 따라 처리됩니다.

3 개의 선택 메소드는, 1 개 이상의 채널이 실행 가능한 상태가 될 때까지 선택 조작이 블록 될지 어떨지, 블록 되는 경우는 어느 정도의 기간 블록 되는가 하는 점 이외는 본질적으로 같습니다.

병행성

셀렉터 자체는, 복수의 병행 thread로 안전하게 사용할 수 있습니다. 그러나, 이것은 키 세트에는 들어맞지 않습니다.

선택 조작은, 셀렉터 자체, 키 세트, 선택된 키 세트를 이 차례로 동기화합니다. 상기의 순서 1 및 3 의 실행시는, 삭제된 키 세트를 동기화합니다.

선택 조작의 실행중에 셀렉터의 키의 대상 세트로 변경을 더해도, 변경이 적용되는 것은 다음의 선택 조작으로부터여, 현재 실행중의 조작에 영향은 없습니다.

키의 취소나 채널의 클로즈는 언제라도 실행할 수 있습니다. 어느 키가 1 개 이상의 셀렉터의 키 세트내에 존재하고 있어도, 그 키가 유효해, 채널이 오픈하고 있다고는 할 수 없습니다. 다른 thread에 의해 키가 삭제되거나 채널이 클로즈 될 가능성이 있는 경우는, 어플리케이션 코드의 동기화를 신중하게 실시해, 필요에 따라서 그 상태를 체크할 필요가 있습니다.

select() 메소드 또는 select(long) 메소드에 의해 블록 된 thread는, 다음의 3 개의 쳐 몇개의 방법으로, 그 외의 thread로부터 인터럽트를 받습니다.

close 메소드는, 셀렉터와 3 개의 키 세트 모든 것을 선택 조작시와 같은 차례로 동기화합니다.

일반적으로, 셀렉터의 키 세트 및 선택된 키 세트는, 복수의 병행 thread로 안전하게 사용할 수 없습니다. 몇개의 세트를 직접 변경하는 thread가 있는 경우, 그 세트를 동기화하는 것에 의해 액세스 제어를 실시할 필요가 있습니다. 이러한 세트의 iterator 메소드에 의해 반환되는 반복자는 fail-fast 입니다. 반복자의 작성 후, 반복자 고유의 remove 메소드 호출해 이외 방법으로 세트가 변경되었을 경우,ConcurrentModificationException 가 throw 됩니다.

도입된 버젼:
1.4
관련 항목:
SelectableChannel , SelectionKey

생성자 의 개요
protected Selector ()
          이 클래스의 새로운 인스턴스를 초기화합니다.
 
메소드의 개요
abstract  void close ()
          이 셀렉터를 클로즈 합니다.
abstract  boolean isOpen ()
          이 셀렉터 상태가 오픈일지 어떨지를 판단합니다.
abstract  Set <SelectionKey > keys ()
          이 셀렉터의 키 세트를 돌려줍니다.
static Selector open ()
          셀렉터를 오픈합니다.
abstract  SelectorProvider provider ()
          이 채널의 작성원프로바이더를 돌려줍니다.
abstract  int select ()
          입출력 조작의 실행이 가능한 대응하는 채널을 가지는 키 세트를 선택합니다.
abstract  int select (long timeout)
          입출력 조작의 실행이 가능한 대응하는 채널을 가지는 키 세트를 선택합니다.
abstract  Set <SelectionKey > selectedKeys ()
          이 셀렉터의 선택된 키 세트를 돌려줍니다.
abstract  int selectNow ()
          입출력 조작의 실행이 가능한 대응하는 채널을 가지는 키 세트를 선택합니다.
abstract  Selector wakeup ()
           아직 종료하고 있지 않는 최초의 선택 조작을 즉시 종료시킵니다.
 
클래스 java.lang. Object 로부터 상속된 메소드
clone , equals , finalize , getClass , hashCode , notify , notifyAll , toString , wait , wait , wait
 

생성자 의 상세

Selector

protected Selector()
이 클래스의 새로운 인스턴스를 초기화합니다.

메소드의 상세

open

public static Selector  open()
                     throws IOException 
셀렉터를 오픈합니다.

새로운 셀렉터를 작성하려면 , 시스템 전체의 디폴트인 SelectorProvider 객체의 openSelector 메소드를 호출합니다.

반환값:
새로운 셀렉터
예외:
IOException - 입출력 에러가 발생했을 경우

isOpen

public abstract boolean isOpen()
이 셀렉터 상태가 오픈일지 어떨지를 판단합니다.

반환값:
이 셀렉터가 오픈인 경우에 한해 true

provider

public abstract SelectorProvider  provider()
이 채널의 작성원프로바이더를 돌려줍니다.

반환값:
이 채널의 작성원프로바이더

keys

public abstract Set <SelectionKey > keys()
이 셀렉터의 키 세트를 돌려줍니다.

키 세트를 직접 변경할 수 없습니다. 키를 취소한 뒤, 채널의 등록이 해제된 시점에서, 그 키가 삭제됩니다. 키 세트를 변경하려고 하면(자),UnsupportedOperationException 가 throw 됩니다.

키 세트는thread에 대해서 안전하지는 않습니다 .

반환값:
이 셀렉터의 키 세트
예외:
ClosedSelectorException - 이 셀렉터가 클로즈 하고 있는 경우

selectedKeys

public abstract Set <SelectionKey > selectedKeys()
이 셀렉터의 선택된 키 세트를 돌려줍니다.

선택된 키 세트로부터 키를 삭제할 수 있습니다만, 이 세트에 직접 키를 추가할 수 없습니다. 키 세트에 객체를 추가하려고 하면(자),UnsupportedOperationException 가 throw 됩니다.

선택된 키 세트는thread에 대해서 안전하지는 않습니다 .

반환값:
이 셀렉터의 선택된 키 세트
예외:
ClosedSelectorException - 이 셀렉터가 클로즈 하고 있는 경우

selectNow

public abstract int selectNow()
                       throws IOException 
입출력 조작의 실행이 가능한 대응하는 채널을 가지는 키 세트를 선택합니다.

이 메소드는, 비블록형의선택 조작을 실행합니다. 전회의 선택 조작 이후, 선택 가능하게 되는 채널이 존재하지 않는 경우, 이 메소드는 즉시 제로를 돌려줍니다.

이 메소드를 호출하면(자), 이전에 호출한 wakeup 메소드의 결과가 클리어 됩니다.

반환값:
선택 조작에 의해 갱신된 실행 가능 조작 세트를 가지는 키의 수. 제로의 경우도 있다
예외:
IOException - 입출력 에러가 발생했을 경우
ClosedSelectorException - 이 셀렉터가 클로즈 하고 있는 경우

select

public abstract int select(long timeout)
                    throws IOException 
입출력 조작의 실행이 가능한 대응하는 채널을 가지는 키 세트를 선택합니다.

이 메소드는, 블록형의선택 조작을 실행합니다. 이 메소드는, 1 개 이상의 채널이 선택되었을 경우, 이 셀렉터의 wakeup 메소드가 불려 갔을 경우, 현재의 thread에 대해서 인터럽트가 발생했을 경우, 또는 지정의 타임 아웃 기간이 종료했을 경우에 한해 종료합니다.

이 메소드는 리얼타임 보증을 실시하지 않습니다. Object.wait(long) 메소드 호출과 같게 타임 아웃의 스케줄을 작성합니다.

파라미터:
timeout - 정의 수의 경우, 채널이 실행 가능 상태가 되는 것을 대기하는 동안, 블록 되는 것은 최대로 대략 timeout 밀리 세컨드, 제로의 경우 무기한의 블록. 부의 수는 지정할 수 없다
반환값:
갱신된 실행 가능 조작 세트를 가지는 키의 수. 제로의 경우도 있다
예외:
IOException - 입출력 에러가 발생했을 경우
ClosedSelectorException - 이 셀렉터가 클로즈 하고 있는 경우
IllegalArgumentException - timeout 인수의 값이 부의 경우

select

public abstract int select()
                    throws IOException 
입출력 조작의 실행이 가능한 대응하는 채널을 가지는 키 세트를 선택합니다.

이 메소드는, 블록형의선택 조작을 실행합니다. 이 메소드는, 1 개 이상의 채널이 선택되었을 경우, 이 셀렉터의 wakeup 메소드가 불려 갔을 경우, 또는 현재의 thread에 대해서 인터럽트가 발생했을 경우에 한해 종료합니다.

반환값:
갱신된 실행 가능 조작 세트를 가지는 키의 수. 제로의 경우도 있다
예외:
IOException - 입출력 에러가 발생했을 경우
ClosedSelectorException - 이 셀렉터가 클로즈 하고 있는 경우

wakeup

public abstract Selector  wakeup()
아직 종료하고 있지 않는 최초의 선택 조작을 즉시 종료시킵니다.

select() 메소드나 select(long) 메소드의 호출시에 그 외의 thread가 블록 되고 있으면(자), 호출은 곧바로 종료합니다. 현재 실행중의 선택 조작이 없는 경우는, 사전에 selectNow() 메소드를 호출하지 않는 한, 다음번 호출시도 이러한 메소드는 곧바로 종료합니다. 이 호출의 반환값은, 어느 경우도 제로 이외의 값입니다. 그 이후, 다음번 호출시까지 이 메소드를 재차 호출하지 않는 한,select() 메소드 또는 select(long) 메소드의 호출은 일반적으로 대로 블록 됩니다.

어느 선택 조작으로부터 다음의 선택 조작까지의 사이에 이 메소드를 2 회 이상 호출해도, 1 회만 호출했을 때와 같은 결과가 됩니다.

반환값:
이 셀렉터

close

public abstract void close()
                    throws IOException 
이 셀렉터를 클로즈 합니다.

이 셀렉터의 선택 메소드내에서 블록 되고 있는 thread가 있는 경우, 셀렉터의 wakeup 메소드를 호출했을 경우와 같게, 이 thread에 대한 인터럽트가 발생합니다.

삭제되지 않고, 셀렉터에 관련지을 수 있던 채로의 키는, 무효가 됩니다. 채널의 등록은 해제되어 이 셀렉터에 관련한 그 외의 모든 자원이 해제됩니다.

셀렉터가 클로즈 하고 있는 상태로 이 메소드를 호출해도, 무슨 효과도 없습니다.

일단 클로즈 한 셀렉터를 재차 이용하려고 하면(자), 이 메소드 또는 wakeup 메소드를 호출하지 않는 한,ClosedSelectorException 가 throw 됩니다.

예외:
IOException - 입출력 에러가 발생했을 경우

JavaTM Platform
Standard Ed. 6

버그의 보고와 기능의 요청
한층 더 자세한 API 레퍼런스 및 개발자 문서에 대해서는,Java SE 개발자용 문서를 참조해 주세요. 개발자전용의 상세한 해설, 개념의 개요, 용어의 정의, 버그의 회피책, 및 코드 실례가 포함되어 있습니다.

Copyright 2006 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms . Documentation Redistribution Policy 도 참조해 주세요.