- java.lang.Object
-
- java.nio.channels.Selector
-
- すべての実装されたインタフェース:
Closeable
,AutoCloseable
- 直系の既知のサブクラス:
AbstractSelector
public abstract class Selector extends Object implements Closeable
SelectableChannel
オブジェクトのマルチプレクサです。セレクタを作成するには、このクラスの
open
メソッドを呼び出します。このメソッドは、システムのデフォルトのセレクタ・プロバイダ
を使って新しいセレクタを作成します。 セレクタは、カスタム・セレクタ・プロバイダのopenSelector
メソッドを呼び出して作成することもできます。 セレクタは、close
メソッドでクローズされるまでオープンの状態を維持します。SelectionKey
オブジェクトは、選択可能チャネルがセレクタに登録されていることを示します。 セレクタは選択キーの3つのセットを管理します。キー・セット。現在このセレクタに登録されているチャネルを示すキーで構成されます。 このセットは
keys
メソッドによって返されます。選択されたキー・セット。前の選択操作中に、個々のキーのチャネルがキーの対象セットに示されている操作のうち少なくとも1つを実行できる状態になっていることが検出された、キーのセットです。 このセットは
selectedKeys
メソッドによって返されます。 常にキー・セットのサブセットになります。取り消されたキー・セット。チャネルの登録はまだ解除されていないが、取消しは完了しているキーのセットです。 このセットに直接アクセスすることはできません。 常にキー・セットのサブセットになります。
新しく作成されたセレクタでは、この3つのセットは空です。
チャネルの
register
メソッドを使ってチャネルを登録すると、その副作用としてセレクタのキー・セットにキーが追加されます。 取り消されたキーは、選択時にキー・セットから削除されます。 キー・セット自体を直接変更することはできません。チャネルのクローズや
cancel
メソッドの呼出しによってキーを取り消すと、このキーがセレクタの取り消されたキー・セットに追加されます。 キーを取り消すと、次の選択時にチャネルの登録が解除されます。取り消されたキーは、この時点で、すべてのセレクタのキー・セットから削除されます。キーは、選択操作によって選択されたキー・セットに追加されます。 選択されたキー・セットから直接キーを削除する場合は、このセットの
remove
メソッドを呼び出すか、このセットから取得されたイテレータ
のremove
メソッドを呼び出します。 それ以外の方法で、選択されたキー・セットからキーを削除することはできません。選択の副作用としてキーが削除されることはありません。 また、選択されたキー・セットに直接キーを追加することもできません。選択
選択のたびに、セレクタの選択されたキー・セットにキーが追加されたり、キー・セットや取り消されたキー・セットからキーが削除されたりします。 選択は、
select()
、select(long)
、およびselectNow()
メソッドにより、次の3段階の手順を経て行われます。取り消されたキー・セットに含まれるすべてのキーが各キー・セットから削除され、チャネルの登録が解除されます。 この手順により、取り消されたキー・セットは空になります。
選択操作が開始された時点で、キーの対象セットに示されたいずれかの操作を実行できる状態のチャネルが更新されたかどうかについて、基本となるオペレーティング・システムが照会されます。 該当するチャネルに対しては、次のいずれかのアクションが実行されます。
選択されたキー・セットから削除されたチャネルのキーがセットに追加され、現在このチャネルで実行可能な操作がわかるように実行可能操作セットが変更されます。 それ以前に実行可能セットに記録された情報は破棄されます。
それ以外の場合、チャネルのキーはすでに選択されたキー・セット内にあります。したがって、実行可能操作セットは、チャネルが実行できる新しい操作がわかるように変更されます。 それ以前に実行可能セットに記録された情報は保存されます。つまり、基本となるシステムから返される実行可能セットは、ビット単位で現在の実行可能セットに分離されます。
手順2の実行中に取り消されたキー・セットに追加されたキーは、手順1に従って処理されます。
3つの選択メソッドは、1個以上のチャネルが実行可能な状態になるまで選択操作がブロックされるかどうか、ブロックされる場合はどのくらいの期間ブロックされるのかという点以外は本質的に同じです。
並行性
セレクタ自体は、複数の並行スレッドで安全に使用できます。しかし、このことはキー・セットには当てはまりません。
選択操作は、セレクタ自体、キー・セット、選択されたキー・セットをこの順番で同期化します。 上記の手順1および3の実行時は、取り消されたキー・セットを同期化します。
選択操作の実行中にセレクタのキーの対象セットに変更を加えても、変更が適用されるのは次の選択操作からであり、現在実行中の操作に影響はありません。
キーの取り消しやチャネルのクローズはいつでも実行できます。 あるキーが1個以上のセレクタのキー・セット内に存在していても、そのキーが有効で、チャネルがオープンしているとは限りません。 別のスレッドによってキーが取り消されたり、チャネルがクローズされる可能性がある場合は、アプリケーション・コードの同期化を慎重に行い、必要に応じてその状態をチェックする必要があります。
select()
メソッドまたはselect(long)
メソッドのいずれかでブロックされたスレッドは、次の3つのうちいずれかの方法で、その他のスレッドから割込みを受けることがあります。セレクタの
wakeup
メソッドの呼出し。セレクタの
close
メソッドの呼出しブロックされたスレッドの
interrupt
メソッドの呼出し。この場合、割込みステータスが設定され、セレクタのwakeup
メソッドが呼び出されます。
close
メソッドは、セレクタと3つのキー・セットすべてを選択操作時と同じ順番で同期化します。通常、セレクタのキー・セットおよび選択されたキー・セットは、複数の並行スレッドで安全に使用できません。 いずれかのセットを直接変更するスレッドがある場合、そのセットを同期化することによってアクセス制御を行う必要があります。 これらのセットの
iterator
メソッドによって返されるイテレータはフェイルファストです。イテレータの作成後、イテレータ固有のremove
メソッド呼出し以外の方法でセットが変更された場合、ConcurrentModificationException
がスローされます。- 導入されたバージョン:
- 1.4
- 関連項目:
SelectableChannel
、SelectionKey
-
-
コンストラクタのサマリー
コンストラクタ 修飾子 コンストラクタ 説明 protected
Selector()
このクラスの新しいインスタンスを初期化します。
-
メソッドのサマリー
すべてのメソッド staticメソッド インスタンス・メソッド 抽象メソッド 具象メソッド 修飾子と型 メソッド 説明 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()
まだ終了していない最初の選択操作をただちに終了させます。
-
-
-
メソッドの詳細
-
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
がスローされます。キー・セットはスレッドセーフではありません。
- 戻り値:
- このセレクタのキー・セット
- 例外:
ClosedSelectorException
- このセレクタがクローズしている場合
-
selectedKeys
public abstract Set<SelectionKey> selectedKeys()
このセレクタの選択されたキー・セットを返します。選択されたキー・セットからキーを削除することはできますが、このセットに直接キーを追加することはできません。 キー・セットにオブジェクトを追加しようとすると、
UnsupportedOperationException
がスローされます。選択されたキー・セットはスレッドセーフではありません。
- 戻り値:
- このセレクタの選択されたキー・セット
- 例外:
ClosedSelectorException
- このセレクタがクローズしている場合
-
selectNow
public abstract int selectNow() throws IOException
入出力操作の実行が可能な対応するチャネルを持つキー・セットを選択します。このメソッドは、非ブロック型の選択操作を実行します。 前回の選択操作以降、選択可能になるチャネルが存在しない場合、このメソッドはただちにゼロを返します。
このメソッドを呼び出すと、以前に呼び出した
wakeup
メソッドの結果がクリアされます。- 戻り値:
- 選択操作によって更新された実行可能操作セットを持つキーの数。ゼロの場合もある
- 例外:
IOException
- 入出力エラーが発生した場合ClosedSelectorException
- このセレクタがクローズしている場合
-
select
public abstract int select(long timeout) throws IOException
入出力操作の実行が可能な対応するチャネルを持つキー・セットを選択します。このメソッドは、ブロック型の選択操作を実行します。 このメソッドは、1個以上のチャネルが選択された場合、このセレクタの
wakeup
メソッドが呼び出された場合、現在のスレッドに対して割込みが発生した場合、または指定のタイム・アウト期間が終了した場合にかぎり終了します。このメソッドはリアルタイム保証を行いません。
Object.wait(long)
メソッドを呼び出した場合と同様にタイム・アウトのスケジュールを作成します。- パラメータ:
timeout
- 正の数の場合、チャネルが実行可能状態になるのを待機する間、ブロックされるのは最大でおよそtimeout
ミリ秒、ゼロの場合無期限のブロック。負の数は指定できない- 戻り値:
- 更新された実行可能操作セットを持つキーの数。ゼロの場合もある
- 例外:
IOException
- 入出力エラーが発生した場合ClosedSelectorException
- このセレクタがクローズしている場合IllegalArgumentException
- timeout引数の値が負の場合
-
select
public abstract int select() throws IOException
入出力操作の実行が可能な対応するチャネルを持つキー・セットを選択します。このメソッドは、ブロック型の選択操作を実行します。 このメソッドは、1個以上のチャネルが選択された場合、このセレクタの
wakeup
メソッドが呼び出された場合、または現在のスレッドに対して割込みが発生した場合にかぎり終了します。- 戻り値:
- 更新された実行可能操作セットを持つキーの数。ゼロの場合もある
- 例外:
IOException
- 入出力エラーが発生した場合ClosedSelectorException
- このセレクタがクローズしている場合
-
wakeup
public abstract Selector wakeup()
まだ終了していない最初の選択操作をただちに終了させます。select()
メソッドまたはselect(long)
メソッドの呼出し時に別のスレッドが現在ブロックされていると、その呼出しはすぐに終了します。 現在進行中の選択操作がない場合は、事前にselectNow()
メソッドを呼び出さないかぎり、これらのメソッドの1つの次回呼出しはすぐに終了します。 この呼出しの戻り値は、いずれの場合もゼロ以外の値です。 それ以降、次回呼出し時までにこのメソッドを再度呼び出さないかぎり、select()
メソッドまたはselect(long)
メソッドの呼出しは通常どおりブロックされます。ある選択操作から次の選択操作までの間にこのメソッドを2回以上呼び出しても、1回だけ呼び出したときと同じ結果になります。
- 戻り値:
- このセレクタ
-
close
public abstract void close() throws IOException
このセレクタをクローズします。このセレクタのいずれかの選択メソッド内で現在ブロックされているスレッドがある場合、セレクタの
wakeup
メソッドを呼び出した場合と同様に、このスレッドに対する割込みが発生します。取り消されておらず、セレクタに関連付けられたままのキーは、無効になります。チャネルの登録は解除され、このセレクタに関連したその他のすべてのリソースが解放されます。
セレクタがクローズしている状態でこのメソッドを呼び出しても、何の効果もありません。
いったんクローズしたセレクタを再度利用しようとすると、このメソッドまたは
wakeup
メソッドを呼び出さないかぎり、ClosedSelectorException
がスローされます。- 定義:
close
、インタフェース:AutoCloseable
- 定義:
close
、インタフェース:Closeable
- 例外:
IOException
- 入出力エラーが発生した場合
-
-