|
JavaTM Platform Standard Ed. 6 |
|||||||||
앞의 클래스 다음의 클래스 | 프레임 있어 프레임 없음 | |||||||||
개요: 상자 | 필드 | 생성자 | 메소드 | 상세: 필드 | 생성자 | 메소드 |
java.lang.Objectjava.nio.channels.Selector
public abstract class Selector
SelectableChannel
객체의 멀티플렉서입니다.
셀렉터를 작성하려면 , 이 클래스의 「키 세트」. 현재 이 셀렉터에 등록되어 있는 채널을 나타내는 키로 구성됩니다. 「선택된 키 세트」. 선택전에, 개개의 키의 채널이 키의 대상 세트에 나타나고 있는 조작의 쳐 어느쪽이든을 실행할 수 있는 상태가 되어 있는 것을 나타내는 키로 구성됩니다. 「삭제된 키 세트」. 채널의 등록은 아직 해제되어 있지 않지만, 취소는 완료하고 있는 키세트입니다. 이 세트에 직접 액세스 할 수 없습니다. 항상 키 세트의 부분집합이 됩니다. 새롭게 작성된 셀렉터에서는, 이 3 개세트는 빈 상태(empty)입니다.
채널의 채널의 클로즈나 키는, 선택 조작에 의해 선택된 키 세트에 추가됩니다. 선택된 키 세트로부터 직접 키를 삭제하고 싶은 경우는, 이 키 세트의 선택마다, 셀렉터의 선택된 키 세트에 키가 추가되거나 키 세트나 삭제된 키 세트로부터 키가 삭제 되거나 합니다. 선택은, 삭제된 키 세트에 포함되는 모든 키가 각 키 세트로부터 삭제되어 채널의 등록이 해제됩니다. 이 순서에 의해, 삭제된 키 세트는 비웁니다. 선택 조작이 개시된 시점에서, 키의 대상 세트에 나타나고 싶은 차이인가의 조작을 실행할 수 있는 상태의 채널이 갱신되었는지 어떠했는지에 임해서, 기본이 되는 operating system가 조회됩니다. 해당하는 채널에 대해서는, 다음의 몇개의 액션이 실행됩니다. 선택된 키 세트로부터 삭제된 채널의 키가 세트에 추가되어 현재 이 채널로 실행 가능한 조작을 알 수 있도록(듯이) 실행 가능 조작 세트가 변경됩니다. 그 이전에 실행 가능 세트에 기록된 정보는 파기됩니다. 그 이외의 경우, 채널의 키는 벌써 선택된 키 세트내에 있습니다. 따라서, 실행 가능 조작 세트는, 채널을 실행할 수 있는 새로운 조작을 알 수 있도록(듯이) 변경됩니다. 그 이전에 실행 가능 세트에 기록된 정보는 보존됩니다. 즉, 기본이 되는 시스템으로부터 반환되는 실행 가능 세트는, 비트 단위로 현재의 실행 가능 세트 로 분리됩니다. 순서 2 의 실행중에 삭제된 키 세트에 추가된 키는, 순서 1 에 따라 처리됩니다. 3 개의 선택 메소드는, 1 개 이상의 채널이 실행 가능한 상태가 될 때까지 선택 조작이 블록 될지 어떨지, 블록 되는 경우는 어느 정도의 기간 블록 되는가 하는 점 이외는 본질적으로 같습니다. 셀렉터 자체는, 복수의 병행 thread로 안전하게 사용할 수 있습니다. 그러나, 이것은 키 세트에는 들어맞지 않습니다.
선택 조작은, 셀렉터 자체, 키 세트, 선택된 키 세트를 이 차례로 동기화합니다. 상기의 순서 1 및 3 의 실행시는, 삭제된 키 세트를 동기화합니다.
선택 조작의 실행중에 셀렉터의 키의 대상 세트로 변경을 더해도, 변경이 적용되는 것은 다음의 선택 조작으로부터여, 현재 실행중의 조작에 영향은 없습니다.
키의 취소나 채널의 클로즈는 언제라도 실행할 수 있습니다. 어느 키가 1 개 이상의 셀렉터의 키 세트내에 존재하고 있어도, 그 키가 유효해, 채널이 오픈하고 있다고는 할 수 없습니다. 다른 thread에 의해 키가 삭제되거나 채널이 클로즈 될 가능성이 있는 경우는, 어플리케이션 코드의 동기화를 신중하게 실시해, 필요에 따라서 그 상태를 체크할 필요가 있습니다.
셀렉터의 셀렉터의 블록 된 thread의 일반적으로, 셀렉터의 키 세트 및 선택된 키 세트는, 복수의 병행 thread로 안전하게 사용할 수 없습니다. 몇개의 세트를 직접 변경하는 thread가 있는 경우, 그 세트를 동기화하는 것에 의해 액세스 제어를 실시할 필요가 있습니다. 이러한 세트의
open
메소드를 호출합니다. 이 메소드는, 시스템의 디폴트
를 사용해 새로운 셀렉터를 작성합니다. 커스텀 셀렉터 프로바이더의 셀렉터 프로바이더
openSelector
메소드를 호출해도, 셀렉터를 작성할 수 있습니다. 셀렉터는,close
메소드로 클로즈 될 때까지 오픈 상태를 유지합니다.
SelectionKey
객체는, 선택 가능 채널이 셀렉터에 등록되어 있는 것을 나타냅니다. 셀렉터는 선택 키의 3 개세트를 관리합니다.
keys
메소드를 호출하면(자) 돌려주어집니다. selectedKeys
메소드를 호출하면(자) 돌려주어집니다. 항상 키 세트의 부분집합이 됩니다. register
메소드를 사용해 채널을 등록하면(자), 그 부작용으로서 셀렉터의 키 세트에 키가 추가됩니다. 삭제된 키는, 선택시에 키 세트로부터 삭제됩니다. 키 세트 자체를 직접 변경할 수 없습니다.
cancel
메소드의 호출에 의해 키를 취소하면(자), 이 키가 셀렉터의 삭제된 키 세트에 추가됩니다. 키를 취소하면(자), 다음의 선택시에 채널의 등록이 해제됩니다. 삭제된 키는, 이 시점에서, 모든 셀렉터의 키 세트로부터 삭제됩니다.
remove
메소드를 호출하는지, 이 세트로부터 취득 가능한
의 반복자
remove
메소드를 호출합니다. 그 이외의 방법으로, 선택된 키 세트로부터 키를 삭제할 수 없습니다. 선택의 부작용으로서 키가 삭제될 것은 없습니다. 또, 선택된 키 세트에 직접 키를 추가할 수도 있습니다. 선택
select()
,select(long)
,selectNow()
의 몇개의 메소드에 의해, 다음의 3 단계의 순서를 거쳐 행해집니다.
병행성
select()
메소드 또는 select(long)
메소드에 의해 블록 된 thread는, 다음의 3 개의 쳐 몇개의 방법으로, 그 외의 thread로부터 인터럽트를 받습니다.
wakeup
메소드의 호출.
close
메소드의 호출.
interrupt
메소드의 호출. 이 경우, 인터럽트 상태가 설정되어 셀렉터의 wakeup
메소드가 불려 갑니다. close
메소드는, 셀렉터와 3 개의 키 세트 모든 것을 선택 조작시와 같은 차례로 동기화합니다.
iterator
메소드에 의해 반환되는 반복자는 fail-fast 입니다. 반복자의 작성 후, 반복자 고유의 remove
메소드 호출해 이외 방법으로 세트가 변경되었을 경우,ConcurrentModificationException
가 throw 됩니다.
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 |
생성자 의 상세 |
---|
protected Selector()
메소드의 상세 |
---|
public static Selector open() throws IOException
새로운 셀렉터를 작성하려면 , 시스템 전체의 디폴트인 SelectorProvider
객체의 openSelector
메소드를 호출합니다.
IOException
- 입출력 에러가 발생했을 경우public abstract boolean isOpen()
public abstract SelectorProvider provider()
public abstract Set <SelectionKey > keys()
키 세트를 직접 변경할 수 없습니다. 키를 취소한 뒤, 채널의 등록이 해제된 시점에서, 그 키가 삭제됩니다. 키 세트를 변경하려고 하면(자),UnsupportedOperationException
가 throw 됩니다.
키 세트는thread에 대해서 안전하지는 않습니다 .
ClosedSelectorException
- 이 셀렉터가 클로즈 하고 있는 경우public abstract Set <SelectionKey > selectedKeys()
선택된 키 세트로부터 키를 삭제할 수 있습니다만, 이 세트에 직접 키를 추가할 수 없습니다. 키 세트에 객체를 추가하려고 하면(자),UnsupportedOperationException
가 throw 됩니다.
선택된 키 세트는thread에 대해서 안전하지는 않습니다 .
ClosedSelectorException
- 이 셀렉터가 클로즈 하고 있는 경우public abstract int selectNow() throws IOException
이 메소드는, 비블록형의선택 조작을 실행합니다. 전회의 선택 조작 이후, 선택 가능하게 되는 채널이 존재하지 않는 경우, 이 메소드는 즉시 제로를 돌려줍니다.
이 메소드를 호출하면(자), 이전에 호출한 wakeup
메소드의 결과가 클리어 됩니다.
IOException
- 입출력 에러가 발생했을 경우
ClosedSelectorException
- 이 셀렉터가 클로즈 하고 있는 경우public abstract int select(long timeout) throws IOException
이 메소드는, 블록형의선택 조작을 실행합니다. 이 메소드는, 1 개 이상의 채널이 선택되었을 경우, 이 셀렉터의 wakeup
메소드가 불려 갔을 경우, 현재의 thread에 대해서 인터럽트가 발생했을 경우, 또는 지정의 타임 아웃 기간이 종료했을 경우에 한해 종료합니다.
이 메소드는 리얼타임 보증을 실시하지 않습니다. Object.wait(long)
메소드 호출과 같게 타임 아웃의 스케줄을 작성합니다.
timeout
- 정의 수의 경우, 채널이 실행 가능 상태가 되는 것을 대기하는 동안, 블록 되는 것은 최대로 대략 timeout 밀리 세컨드, 제로의 경우 무기한의 블록. 부의 수는 지정할 수 없다
IOException
- 입출력 에러가 발생했을 경우
ClosedSelectorException
- 이 셀렉터가 클로즈 하고 있는 경우
IllegalArgumentException
- timeout 인수의 값이 부의 경우public abstract int select() throws IOException
이 메소드는, 블록형의선택 조작을 실행합니다. 이 메소드는, 1 개 이상의 채널이 선택되었을 경우, 이 셀렉터의 wakeup
메소드가 불려 갔을 경우, 또는 현재의 thread에 대해서 인터럽트가 발생했을 경우에 한해 종료합니다.
IOException
- 입출력 에러가 발생했을 경우
ClosedSelectorException
- 이 셀렉터가 클로즈 하고 있는 경우public abstract Selector wakeup()
select()
메소드나 select(long)
메소드의 호출시에 그 외의 thread가 블록 되고 있으면(자), 호출은 곧바로 종료합니다. 현재 실행중의 선택 조작이 없는 경우는, 사전에 selectNow()
메소드를 호출하지 않는 한, 다음번 호출시도 이러한 메소드는 곧바로 종료합니다. 이 호출의 반환값은, 어느 경우도 제로 이외의 값입니다. 그 이후, 다음번 호출시까지 이 메소드를 재차 호출하지 않는 한,select()
메소드 또는 select(long)
메소드의 호출은 일반적으로 대로 블록 됩니다.
어느 선택 조작으로부터 다음의 선택 조작까지의 사이에 이 메소드를 2 회 이상 호출해도, 1 회만 호출했을 때와 같은 결과가 됩니다.
public abstract void close() throws IOException
이 셀렉터의 선택 메소드내에서 블록 되고 있는 thread가 있는 경우, 셀렉터의 wakeup
메소드를 호출했을 경우와 같게, 이 thread에 대한 인터럽트가 발생합니다.
삭제되지 않고, 셀렉터에 관련지을 수 있던 채로의 키는, 무효가 됩니다. 채널의 등록은 해제되어 이 셀렉터에 관련한 그 외의 모든 자원이 해제됩니다.
셀렉터가 클로즈 하고 있는 상태로 이 메소드를 호출해도, 무슨 효과도 없습니다.
일단 클로즈 한 셀렉터를 재차 이용하려고 하면(자), 이 메소드 또는 wakeup
메소드를 호출하지 않는 한,ClosedSelectorException
가 throw 됩니다.
IOException
- 입출력 에러가 발생했을 경우
|
JavaTM Platform Standard Ed. 6 |
|||||||||
앞의 클래스 다음의 클래스 | 프레임 있어 프레임 없음 | |||||||||
개요: 상자 | 필드 | 생성자 | 메소드 | 상세: 필드 | 생성자 | 메소드 |
Copyright 2006 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms . Documentation Redistribution Policy 도 참조해 주세요.