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