- すべての実装されたインタフェース:
Closeable
,AutoCloseable
- 直系の既知のサブクラス:
AbstractSelector
SelectableChannel
オブジェクトのマルチプレクサです。
セレクタを作成するには、このクラスのopen
メソッドを呼び出します。このメソッドは、システムのデフォルトのセレクタ・プロバイダ
を使って新しいセレクタを作成します。 セレクタは、カスタム・セレクタ・プロバイダのopenSelector
メソッドを呼び出して作成することもできます。 セレクタは、close
メソッドでクローズされるまでオープンの状態を維持します。
SelectionKey
オブジェクトは、選択可能チャネルがセレクタに登録されていることを示します。 セレクタは選択キーの3つのセットを管理します。
キー・セット。現在このセレクタに登録されているチャネルを示すキーで構成されます。 このセットは
keys
メソッドによって返されます。「選択されたキー・セット」は、キーの追加またはキーの更新を行う前の選択操作で設定された操作のうち少なくとも1つの操作に対して、各キー・チャネルが準備できていることが検出される、キーのセットです。 このセットは
selectedKeys
メソッドによって返されます。 常にキー・セットのサブセットになります。取り消されたキー・セット。チャネルの登録はまだ解除されていないが、取消しは完了しているキーのセットです。 このセットに直接アクセスすることはできません。 常にキー・セットのサブセットになります。
新しく作成されたセレクタでは、この3つのセットは空です。
チャネルのregister
メソッドを使ってチャネルを登録すると、その副作用としてセレクタのキー・セットにキーが追加されます。 取り消されたキーは、選択時にキー・セットから削除されます。 キー・セット自体を直接変更することはできません。
チャネルのクローズやcancel
メソッドの呼出しによってキーを取り消すと、このキーがセレクタの取り消されたキー・セットに追加されます。 キーを取り消すと、次の選択操作中にそのチャネルが登録解除され、その時点ですべてのセレクタ・キー・セットからキーが削除されます。
キーは、選択操作によって選択されたキー・セットに追加されます。 選択されたキー・セットから直接キーを削除する場合は、このセットのremove
メソッドを呼び出すか、このセットから取得されたイテレータ
のremove
メソッドを呼び出します。 すべてのキーは、set clear
メソッドを起動することによって、選択されたキー・セットから削除できます。 また、選択されたキー・セットに直接キーを追加することもできません。
選択項目
選択操作は、基礎となるオペレーティング・システムに対して、登録済の各チャネルの準備として更新を問い合せ、そのキー関心セットによって識別された操作を実行します。 選択操作には2つの形式があります。
select()
、select(long)
およびselectNow()
メソッドは、操作を実行する準備ができたチャネルのキーを、選択されたキー・セットに追加するか、すでに選択されたキー・セットにすでに存在するキーのすぐに操作セットを更新します。select(Consumer)
、select(Consumer, long)
およびselectNow(Consumer)
メソッドは、操作の実行準備ができている各チャネルのキーに対してactionを実行します。 これらのメソッドは、選択されたキー・セットには追加されません。
選択されたキー・セットに追加される選択操作
選択のたびに、セレクタの選択されたキー・セットにキーが追加されたり、キー・セットや取り消されたキー・セットからキーが削除されたりします。 選択は、select()
、select(long)
、およびselectNow()
メソッドにより、3ステップを経て行われます。
取り消されたキー・セットに含まれるすべてのキーが各キー・セットから削除され、チャネルの登録が解除されます。 このステップにより、取り消されたキー・セットは空になります。
選択操作が開始された時点で、キーの対象セットに示されたいずれかの操作を実行できる状態のチャネルが更新されたかどうかについて、基本となるオペレーティング・システムが照会されます。 該当するチャネルに対しては、次のいずれかのアクションが実行されます。
選択されたキー・セットから削除されたチャネルのキーがセットに追加され、現在このチャネルで実行可能な操作がわかるように実行可能操作セットが変更されます。 それ以前に実行可能セットに記録された情報は破棄されます。
それ以外の場合、チャネルのキーはすでに選択されたキー・セット内にあります。したがって、実行可能操作セットは、チャネルが実行できる新しい操作がわかるように変更されます。 それ以前に実行可能セットに記録された情報は保存されます。つまり、基本となるシステムから返される実行可能セットは、ビット単位で現在の実行可能セットに分離されます。
ステップ(2)の実行中に取り消されたキー・セットに追加されたキーは、ステップ(1)に従って処理されます。
3つの選択メソッドは、1個以上のチャネルが実行可能な状態になるまで選択操作がブロックされるかどうか、ブロックされる場合はどのくらいの期間ブロックされるのかという点以外は本質的に同じです。
選択したキーに対してアクションを実行する選択操作
選択操作のたびに、セレクタ・キー・セット、選択されたキー・セット、および取り消されたキー・セットからキーが削除されます。 選択はselect(Consumer)
、select(Consumer,long)
およびselectNow(Consumer)
メソッドによって実行され、3つのステップが含まれます。
取り消されたキー・セットに含まれるすべてのキーが各キー・セットから削除され、チャネルの登録が解除されます。 このステップにより、取り消されたキー・セットは空になります。
選択操作が開始された時点で、キーの対象セットに示されたいずれかの操作を実行できる状態のチャネルが更新されたかどうかについて、基本となるオペレーティング・システムが照会されます。
そのような操作を1つ以上実行できる状態のチャネルの場合、チャネル・キーのすぐに操作セットは、チャネルの準備ができている操作を正確に識別するように設定され、
select
メソッドに指定されたactionはチャネル・キーを使用するために起動されます。 以前にreadyセットに記録された準備情報は、actionを起動する前に破棄されます。また、チャネルが複数の操作の準備が完了している場合、actionは、チャネルの準備ができている操作のサブセットに変更が設定されているチャネル・キーおよびパッシブ操作を使用して、複数回呼び出すことができます。 同じキーに対してactionが2回以上呼び出された場合、同じ選択操作でのactionへの直前の呼出しでセットに含まれていた操作ビットは、すぐには含まれません。
ステップ(2)の実行中に取り消されたキー・セットに追加されたキーは、ステップ(1)に従って処理されます。
同時実行性
セレクタとそのキー・セットは、複数の同時スレッドで安全に使用できます。 ただし、その選択されたキー・セットと取消し済キー・セットは対象となりません。
選択操作は、選択されたキー・セットでその順序でセレクタ自体に対して同期化されます。 上記のステップ1および3の実行時は、取り消されたキー・セットを同期化します。
選択操作の実行中にセレクタのキーの対象セットに変更を加えても、変更が適用されるのは次の選択操作からであり、現在実行中の操作に影響はありません。
キーの取り消しやチャネルのクローズはいつでも実行できます。 あるキーが1個以上のセレクタのキー・セット内に存在していても、そのキーが有効で、チャネルがオープンしているとは限りません。 別のスレッドによってキーが取り消されたり、チャネルがクローズされる可能性がある場合は、アプリケーション・コードの同期化を慎重に行い、必要に応じてその状態をチェックする必要があります。
選択操作でブロックされたスレッドは、次の3つのいずれかの方法で他のスレッドによって中断される可能性があります。
セレクタの
wakeup
メソッドの呼出し。セレクタの
close
メソッドの呼出しブロックされたスレッドの
interrupt
メソッドの呼出し。この場合、割込みステータスが設定され、セレクタのwakeup
メソッドが呼び出されます。
close
メソッドは、選択操作と同じ順序でセレクタおよびその選択されたキー・セットに対して同期化を行います。
セレクタ・キー・セットは、複数の同時スレッドで安全に使用できます。 キー・セットからの取得操作は、通常はブロックされないため、セットに追加された新しい登録や、セットからキーを削除する選択操作の取消しステップによって重複する可能性があります。 イテレータおよびスプリッテレータは、イテレータ/スプリッテレータの作成以降、ある時点またはそれ以降のセットの状態を反映して要素を戻します。 これらがConcurrentModificationException
をスローすることはありません。
選択されたセレクタ・キー・セットは、通常、複数の同時スレッドで使用しても安全ではありません。 このようなスレッドがセットを直接変更する可能性がある場合は、セット自体の同期化によってアクセスを制御する必要があります。 セットiterator
メソッドによって戻されるイテレータは、イテレータの作成後にセットが変更された場合は、イテレータ自体のremove
メソッドを起動する以外に、ConcurrentModificationException
がスローされます。
- 導入されたバージョン:
- 1.4
- 関連項目:
-
コンストラクタのサマリー
-
メソッドのサマリー
修飾子と型メソッド説明abstract void
close()
このセレクタをクローズします。abstract boolean
isOpen()
このセレクタの状態がオープンであるかどうかを判断します。abstract Set
<SelectionKey> keys()
このセレクタのキー・セットを返します。static Selector
open()
セレクタをオープンします。abstract SelectorProvider
provider()
このチャネルの作成元プロバイダを返します。abstract int
select()
入出力操作の実行が可能な対応するチャネルを持つキー・セットを選択します。abstract int
select
(long timeout) 入出力操作の実行が可能な対応するチャネルを持つキー・セットを選択します。int
select
(Consumer<SelectionKey> action) 対応するチャネルがI/O操作の準備ができているキーに対して、アクションを選択および実行します。int
select
(Consumer<SelectionKey> action, long timeout) 対応するチャネルがI/O操作の準備ができているキーに対して、アクションを選択および実行します。abstract Set
<SelectionKey> このセレクタの選択されたキー・セットを返します。abstract int
入出力操作の実行が可能な対応するチャネルを持つキー・セットを選択します。int
selectNow
(Consumer<SelectionKey> action) 対応するチャネルがI/O操作の準備ができているキーに対して、アクションを選択および実行します。abstract Selector
wakeup()
まだ終了していない最初の選択操作をただちに終了させます。
-
コンストラクタの詳細
-
Selector
protected Selector()このクラスの新しいインスタンスを初期化します。
-
-
メソッドの詳細
-
open
public static Selector open() throws IOExceptionセレクタをオープンします。システム全体のデフォルト
SelectorProvider
オブジェクトのopenSelector
メソッドを呼び出すことで、新しいセレクタが作成されます。- 戻り値:
- 新しいセレクタ
- 例外:
IOException
- 入出力エラーが発生した場合
-
isOpen
public abstract boolean isOpen()このセレクタの状態がオープンであるかどうかを判断します。- 戻り値:
- このセレクタがオープンしている場合のみ
true
-
provider
-
keys
public abstract Set<SelectionKey> keys()このセレクタのキー・セットを返します。キー・セットを直接変更することはできません。 キーを取り消したあと、チャネルの登録が解除された時点で、そのキーが削除されます。 キー・セットを変更しようとすると、
UnsupportedOperationException
がスローされます。セットは、複数の同時スレッドで使用する「安全」です。
- 戻り値:
- このセレクタのキー・セット
- 例外:
ClosedSelectorException
- このセレクタがクローズしている場合
-
selectedKeys
public abstract Set<SelectionKey> selectedKeys()このセレクタの選択されたキー・セットを返します。選択されたキー・セットからキーを削除することはできますが、このセットに直接キーを追加することはできません。 キー・セットにオブジェクトを追加しようとすると、
UnsupportedOperationException
がスローされます。選択されたキー・セットはスレッドセーフではありません。
- 戻り値:
- このセレクタの選択されたキー・セット
- 例外:
ClosedSelectorException
- このセレクタがクローズしている場合
-
selectNow
public abstract int selectNow() throws IOException入出力操作の実行が可能な対応するチャネルを持つキー・セットを選択します。このメソッドは、非ブロック型の選択操作を実行します。 前回の選択操作以降、選択可能になるチャネルが存在しない場合、このメソッドはただちにゼロを返します。
このメソッドを呼び出すと、以前に呼び出した
wakeup
メソッドの結果がクリアされます。- 戻り値:
- 準備完了演算セットがチャネルが準備完了として検出されなかった演算のうち、少なくとも1つのカテゴリの準備状態を示している可能性があるキーの数
- 例外:
IOException
- 入出力エラーが発生した場合ClosedSelectorException
- このセレクタがクローズしている場合
-
select
public abstract int select(long timeout) throws IOException 入出力操作の実行が可能な対応するチャネルを持つキー・セットを選択します。このメソッドは、ブロック型の選択操作を実行します。 このメソッドは、1個以上のチャネルが選択された場合、このセレクタの
wakeup
メソッドが呼び出された場合、現在のスレッドに対して割込みが発生した場合、または指定のタイム・アウト期間が終了した場合にかぎり終了します。このメソッドはリアルタイム保証を行いません。
Object.wait(long)
メソッドを呼び出した場合と同様にタイム・アウトのスケジュールを作成します。- パラメータ:
timeout
- 正の場合、チャネルの準備が整うのを待機している間、最大でtimeout
ミリ秒以下ブロックします。ゼロの場合、無期限にブロックします。負の値にすることはできません- 戻り値:
- 準備完了演算セットがチャネルが準備完了として検出されなかった演算のうち、少なくとも1つのカテゴリの準備状態を示している可能性があるキーの数
- 例外:
IOException
- 入出力エラーが発生した場合ClosedSelectorException
- このセレクタがクローズしている場合IllegalArgumentException
- timeout引数の値が負の場合
-
select
public abstract int select() throws IOException入出力操作の実行が可能な対応するチャネルを持つキー・セットを選択します。このメソッドは、ブロック型の選択操作を実行します。 このメソッドは、1個以上のチャネルが選択された場合、このセレクタの
wakeup
メソッドが呼び出された場合、または現在のスレッドに対して割込みが発生した場合にかぎり終了します。- 戻り値:
- 準備完了演算セットがチャネルが準備完了として検出されなかった演算のうち、少なくとも1つのカテゴリの準備状態を示している可能性があるキーの数
- 例外:
IOException
- 入出力エラーが発生した場合ClosedSelectorException
- このセレクタがクローズしている場合
-
select
public int select(Consumer<SelectionKey> action, long timeout) throws IOException 対応するチャネルがI/O操作の準備ができているキーに対して、アクションを選択および実行します。このメソッドは、ブロック型の選択操作を実行します。 これは、少なくとも1つのチャネルが選択されている場合にのみオペレーティング・システムへの問合せを実行します。このセレクタ
wakeup
メソッドが呼び出され、現在のスレッドが中断されたか、または指定のタイムアウト期間の期限が切れるか、最初のタイムアウト期間が経過した場合にのみ起動されます。指定されたaction
accept
メソッドが、キー関心セットによって特定された操作を実行する準備ができた各チャネルのキーとともに起動されます。accept
メソッドは、同じキーに対して複数回呼び出される可能性がありますが、そのチャネルの準備が完了している(前述のとおり)の処理のサブセットが含まれています。 セレクタとその選択されたキー・セットでの同期中にaccept
メソッドが呼び出されます。 これらのオブジェクトも同期する他のスレッドとのデッドロックを避けるには、大きな注意が必要です。 選択操作は一般的には再入可能ではないため、同じセレクタに対する選択操作を実行しないでください。 リエントラント選択操作が実装固有であるため指定されていない場合の動作です。 actionがセレクタをクローズすると、アクションが完了するとClosedSelectorException
がスローされます。 actionは、セレクタに登録されたチャネルのクローズ、キーの取消しまたはキー関心セットの変更を禁止していません。 チャネルが選択されてもそのキーが取り消されたり、そのキーに対してactionが実行される前にそのキー・セットが変更された場合、actionが(invalid
キーを使用して起動できます。)を起動したかどうかに固有の実装になります。 アクションによってスローされた例外は、呼出し側に中継されます。このメソッドはリアルタイム保証を行いません。
Object.wait(long)
メソッドを呼び出した場合と同様にタイム・アウトのスケジュールを作成します。- 実装要件:
- デフォルトの実装では、選択されたキー・セットのすべてのキーが削除され、指定されたタイムアウトを使用して
select(long)
が起動され、選択したキー・セットに追加された各キーに対してアクションが実行されます。 デフォルトの実装では、リエントラント選択操作を実行するアクションを検出しません。 デフォルトの実装が完了すると、選択されたキー・セットが空の場合とそうでない場合があります。 - パラメータ:
action
- 実行するアクションtimeout
- 正の場合、チャネルの準備が整うのを待機している間、最大でtimeout
ミリ秒以下ブロックします。ゼロの場合、無期限にブロックします。負の値にすることはできません- 戻り値:
- 消費された一意キーの数(ゼロの可能性あり)
- 例外:
IOException
- 入出力エラーが発生した場合ClosedSelectorException
- このセレクタがクローズされているか、アクションによってクローズされている場合IllegalArgumentException
- timeout引数の値が負の場合- 導入されたバージョン:
- 11
-
select
public int select(Consumer<SelectionKey> action) throws IOException 対応するチャネルがI/O操作の準備ができているキーに対して、アクションを選択および実行します。このメソッドは、ブロック型の選択操作を実行します。 これは、少なくとも1つのチャネルが選択されている場合にのみオペレーティング・システムの問合せを実行します。このセレクタ
wakeup
メソッドが起動されるか、現在のスレッドが中断されたか、早い方が中断されます。このメソッドは、
0
のタイムアウトが無期限にブロックされるように2-argselect
メソッドを呼び出した場合に相当します。- 実装要件:
- デフォルトの実装は、
0
のタイムアウトが発生した2引数select
メソッドを呼び出します。 - パラメータ:
action
- 実行するアクション- 戻り値:
- 消費された一意キーの数(ゼロの可能性あり)
- 例外:
IOException
- 入出力エラーが発生した場合ClosedSelectorException
- このセレクタがクローズされているか、アクションによってクローズされている場合- 導入されたバージョン:
- 11
-
selectNow
public int selectNow(Consumer<SelectionKey> action) throws IOException 対応するチャネルがI/O操作の準備ができているキーに対して、アクションを選択および実行します。このメソッドは、非ブロック型の選択操作を実行します。
このメソッドを呼び出すと、以前に呼び出した
wakeup
メソッドの結果がクリアされます。- 実装要件:
- デフォルトの実装では、選択キー・セットからすべてのキーが削除され、
selectNow()
が起動され、選択したキー・セットに追加された各キーに対してアクションが実行されます。 デフォルトの実装では、リエントラント選択操作を実行するアクションを検出しません。 デフォルトの実装が完了すると、選択されたキー・セットが空の場合とそうでない場合があります。 - パラメータ:
action
- 実行するアクション- 戻り値:
- 消費された一意キーの数(ゼロの可能性あり)
- 例外:
IOException
- 入出力エラーが発生した場合ClosedSelectorException
- このセレクタがクローズされているか、アクションによってクローズされている場合- 導入されたバージョン:
- 11
-
wakeup
public abstract Selector wakeup()まだ終了していない最初の選択操作をただちに終了させます。選択操作で別のスレッドが現在ブロックされている場合、その呼出しはただちに復帰します。 現在選択操作が進行中でない場合は、
selectNow()
またはselectNow(Consumer)
が実効で起動されないかぎり、選択操作の次の呼出しはすぐに終了します。 この呼出しの戻り値は、いずれの場合もゼロ以外の値です。 その後の選択操作は、このメソッドがその間に再度呼び出されないかぎり通常どおりブロックされます。ある選択操作から次の選択操作までの間にこのメソッドを2回以上呼び出しても、1回だけ呼び出したときと同じ結果になります。
- 戻り値:
- このセレクタ
-
close
public abstract void close() throws IOExceptionこのセレクタをクローズします。このセレクタのいずれかの選択メソッド内で現在ブロックされているスレッドがある場合、セレクタの
wakeup
メソッドを呼び出した場合と同様に、このスレッドに対する割込みが発生します。取り消されておらず、セレクタに関連付けられたままのキーは、無効になります。チャネルの登録は解除され、このセレクタに関連したその他のすべてのリソースが解放されます。
セレクタがクローズしている状態でこのメソッドを呼び出しても、何の効果もありません。
いったんクローズしたセレクタを再度利用しようとすると、このメソッドまたは
wakeup
メソッドを呼び出さないかぎり、ClosedSelectorException
がスローされます。- 定義:
close
、インタフェースAutoCloseable
- 定義:
close
、インタフェースCloseable
- 例外:
IOException
- 入出力エラーが発生した場合
-