|
JavaTM 2 Platform Standard Ed. 5.0 |
|||||||||
前のクラス 次のクラス | フレームあり フレームなし | |||||||||
概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
java.lang.Object java.nio.channels.Selector
public abstract class Selector
SelectableChannel
オブジェクトのマルチプレクサです。
セレクタを作成するには、このクラスの セレクタに登録されている選択可能チャネルは、 「キーセット」。現在このセレクタに登録されているチャネルを示すキーで構成される。 「選択されたキーセット」。このキーセット内に含まれるキーはそれぞれ、その対応するチャネルが、前回選択時の対象セットに含まれていた操作の少なくとも 1 つを実行できる状態になっていることを示す。 「取り消されたキーセット」。取り消しは完了しているが、チャネルの登録はまだ解除されていないキーのセット。このセットに直接アクセスすることはできない。常にキーセットのサブセットとなる 新しく作成されたセレクタでは、この 3 つのセットは空です。
セレクタのキーセットには、チャネルの セレクタの取り消されたキーセットには、チャネルのクローズや 選択操作を実行すると、選択されたキーセットにキーが追加されます。選択されたキーセットから直接キーを削除する場合は、選択されたキーセットの 選択操作のたびに、セレクタの選択されたキーセットに対してキーの追加および削除が実行されるとともに、キーセットおよび取り消されたキーセットからキーが削除されます。選択は、 取り消されたキーセットに含まれるすべてのキーが所属する各キーセットから削除されるとともに、それらに対応するチャネルの登録もすべて解除されます。この手順が完了すると、取り消されたキーセットは空になります。 キーの対象セットに含まれる操作の少なくとも 1 つを実行できる状態になったチャネルが選択開始の時点で存在するかどうかの最新情報を得るために、基本となるオペレーティングシステムに照会します。該当するチャネルに対しては、次のいずれかのアクションが実行されます。 選択されたキーセット内にそのチャネルのキーが存在しなかった場合、選択されたキーセット内にそのキーが追加されるとともに、実行可能操作セットが変更され、そのチャネルで準備が整ったと報告された操作が登録される。それ以前に実行可能操作セットに記録されていた情報は破棄される そうでない場合は、そのチャネルのキーはすでに選択されたキーセット内に存在しているため、実行可能操作セットが変更され、そのチャネルで準備が整ったと報告された操作がすべて登録される。それ以前に実行可能操作セットに記録されていた情報は保存される。つまり、基本となるシステムから返された実行可能操作セットは現在の実行可能操作セットに「bitwise-disjoin (ビット単位での分離)」される 手順 2 の実行中に取り消されたキーセットに追加されたキーが存在する場合、それらのキーは手順 1 に従って処理されます。 3 つの選択メソッドの本質的な違いは、1 個以上のチャネルの準備が整うまで選択操作がブロックされるかどうかと、ブロックされる場合にどのくらいの期間ブロックされるのか、の 2 点だけです。 セレクタ自体は、複数の並行スレッドで安全に使用できます。しかし、このことはキーセットには当てはまりません。
選択操作は、セレクタ自体、キーセット、選択されたキーセットをこの順番で同期化します。上記の手順 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
メソッドによって返される反復子は fail-fast です。反復子の作成後、反復子固有の 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()
まだ終了していない最初の選択操作をただちに終了させます。 |
クラス 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
がスローされます。
キーセットはスレッドセーフではありません。
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()
メソッドを呼び出さないかぎり、次回呼び出し時もこれらのメソッドはすぐに終了します。この呼び出しの戻り値は、いずれの場合もゼロ以外の値です。それ以降、次回呼び出し時までにこのメソッドを再度呼び出さないかぎり、select()
メソッドまたは select(long)
メソッドの呼び出しは通常どおりブロックされます。
ある選択操作から次の選択操作までの間にこのメソッドを 1 回以上呼び出しても、1 回だけ呼び出したときと同じ結果になります。
public abstract void close() throws IOException
このセレクタの選択メソッド内でブロックされているスレッドがある場合、セレクタの wakeup
メソッドを呼び出した場合と同様に、このスレッドに対する割り込みが発生します。
取り消されておらず、セレクタに関連付けられたままのキーは、無効になります。チャネルの登録は解除され、このセレクタに関連したその他のすべてのリソースが解放されます。
セレクタがクローズしている状態でこのメソッドを呼び出しても、何の効果もありません。
いったんクローズしたセレクタを再度利用しようとすると、このメソッドまたは wakeup
メソッドを呼び出す場合を除き、ClosedSelectorException
がスローされます。
IOException
- 入出力エラーが発生した場合
|
JavaTM 2 Platform Standard Ed. 5.0 |
|||||||||
前のクラス 次のクラス | フレームあり フレームなし | |||||||||
概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
Copyright 2004 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。