public abstract class SelectableChannel extends AbstractInterruptibleChannel implements Channel
Selector
経由で多重化できるチャネルです。
セレクタで使用するためには、まず、register
メソッドを使ってこのクラスのインスタンスを登録する必要があります。このメソッドは、セレクタへのチャネルの登録を表す新しいSelectionKey
オブジェクトを返します。
セレクタに登録されたチャネルは、登録を解除するまで登録されたままになります。登録を解除するには、セレクタによってチャネルに割り当てられたリソースを解放する必要があります。
チャネルの登録を直接解除することはできません。その代わりに、登録を表すキーを取り消します。キーを取り消すには、セレクタが次の選択を行っている間にチャネルの登録を解除します。キーは、cancel
メソッドを呼び出すことで明示的に取り消すことができます。close
メソッドの呼び出し、またはチャネル上の入出力操作中にブロックされたスレッドに対する割り込みによってチャネルをクローズすると、必然的に、そのチャネルのすべてのキーが取り消されます。
セレクタ自体をクローズすると、チャネルの登録が解除され、その登録を示していたキーも即座に無効になります。
チャネルは特定のセレクタに対して、多くても一度しか登録できません。
チャネルが1個以上のセレクタに登録されていないかどうかを確認するには、isRegistered
メソッドを呼び出します。
選択可能チャネルは、複数の並行スレッドで安全に使用できます。
isBlocking
メソッドを呼び出すことで判断できます。
新しく作成された選択可能チャネルは、常にブロック・モードになります。非ブロック・モードは、セレクタ・ベースの多重化と共にもっとも有用です。セレクタに登録する前に、チャネルを非ブロック・モードにし、登録解除までそのままにしておく必要があります。
SelectionKey
、Selector
修飾子 | コンストラクタと説明 |
---|---|
protected |
SelectableChannel()
このクラスの新しいインスタンスを初期化します。
|
修飾子と型 | メソッドと説明 |
---|---|
abstract Object |
blockingLock()
configureBlocking およびregister メソッドが同期するオブジェクトを取得します。 |
abstract SelectableChannel |
configureBlocking(boolean block)
このチャネルのブロック・モードを調整します。
|
abstract boolean |
isBlocking()
このチャネル上の個々の入出力操作が前の入出力操作が完了するまでブロックされるかどうかを判断します。
|
abstract boolean |
isRegistered()
現在このチャネルがセレクタに登録されているかどうかを判断します。
|
abstract SelectionKey |
keyFor(Selector sel)
チャネルが指定されたセレクタに登録されていることを示すキーを取得します。
|
abstract SelectorProvider |
provider()
このチャネルの作成元プロバイダを返します。
|
SelectionKey |
register(Selector sel, int ops)
このチャネルを指定されたセレクタに登録し、選択キーを返します。
|
abstract SelectionKey |
register(Selector sel, int ops, Object att)
このチャネルを指定されたセレクタに登録し、選択キーを返します。
|
abstract int |
validOps()
このチャネルのサポートされている操作を識別する操作セットを返します。
|
begin, close, end, implCloseChannel, isOpen
public abstract SelectorProvider provider()
public abstract int validOps()
public abstract boolean isRegistered()
キーの取り消しからチャネルの登録解除までの間に発生する必然的な遅延のため、キーをすべて取り消しても、しばらくの間チャネルの登録は解除されません。チャネルをクローズしたときも同様です。
public abstract SelectionKey keyFor(Selector sel)
sel
- セレクタpublic abstract SelectionKey register(Selector sel, int ops, Object att) throws ClosedChannelException
現在このチャネルが指定されたセレクタに登録されている場合、この登録を示す選択キーが返されます。キーの対象セットは、interestOps(int)
メソッドを呼び出した場合と同様にopsに変更されます。att引数の値がnull以外の場合、キーの添付はその値に設定されています。キーがすでに取り消されている場合、CancelledKeyException
がスローされます。
それ以外の場合、このチャネルは指定されたセレクタにまだ登録されていません。登録処理のあと、新しく生成されたキーが返されます。キーの対象セットの初期値はops、添付はattになります。
このメソッドはいつでも呼び出すことができます。このメソッドの呼出し中、またはconfigureBlocking
メソッドの呼出し中に重複してこのメソッドを呼び出した場合、新しく呼び出したメソッドは最初のメソッドの処理が完了するまでブロックされます。その後、このメソッドとセレクタのキー・セットの同期がとられます。このため、同じセレクタを使用する別の登録または選択処理と並行して呼び出された場合、このメソッドはブロックされます。
この操作の実行中にこのチャネルがクローズした場合、このメソッドから返されるキーは取り消され、無効になります。
sel
- このチャネルの登録先セレクタops
- 結果として得られるキーの対象セットatt
- 結果として得られるキーの添付。nullの場合もあるClosedChannelException
- このチャネルがクローズしている場合ClosedSelectorException
- セレクタがクローズしている場合IllegalBlockingModeException
- このチャネルがブロック・モードの場合IllegalSelectorException
- このチャネルの作成元プロバイダが指定されたセレクタの作成元プロバイダと違う場合CancelledKeyException
- チャネルは指定されたセレクタに登録されているが、対応するキーがすでに取り消されている場合IllegalArgumentException
- opsセット内のビットがこのチャネルでサポートされる操作に対応していない場合(set & ~validOps() != 0
の場合)public final SelectionKey register(Selector sel, int ops) throws ClosedChannelException
このメソッドを次の形式で呼び出すと、上記の動作が行われます。
sc.register(sel, ops)次の呼び出しと正確に同じ動作になります。
sc.register
(sel, ops, null)
sel
- このチャネルの登録先セレクタops
- 結果として得られるキーの対象セットClosedChannelException
- このチャネルがクローズしている場合ClosedSelectorException
- セレクタがクローズしている場合IllegalBlockingModeException
- このチャネルがブロック・モードの場合IllegalSelectorException
- このチャネルの作成元プロバイダが指定されたセレクタの作成元プロバイダと違う場合CancelledKeyException
- チャネルは指定されたセレクタに登録されているが、対応するキーがすでに取り消されている場合IllegalArgumentException
- ops内のビットがこのチャネルでサポートされる操作に対応していない場合(set & ~validOps() != 0
の場合)public abstract SelectableChannel configureBlocking(boolean block) throws IOException
このチャネルが1個以上のセレクタに登録されている場合、ブロック・モードに設定しようとすると、IllegalBlockingModeException
がスローされます。
このメソッドはいつでも呼び出すことができます。新しいブロック・モードは、このメソッドの終了後に開始された入出力操作だけに影響を及ぼします。実装によっては、保留された入出力操作が完了するまでブロックを続行する必要があります。
このメソッドの呼出し中、またはregister
メソッドの呼出し中に重複してこのメソッドを呼び出した場合、新しく呼び出したメソッドは最初のメソッドの処理が完了するまでブロックされます。
block
- trueの場合はこのチャネルがブロック・モードになり、falseの場合は非ブロック・モードになるClosedChannelException
- このチャネルがクローズしている場合IllegalBlockingModeException
- blockがtrueで、このチャネルが1個以上のセレクタに登録されている場合IOException
- 入出力エラーが発生した場合public abstract boolean isBlocking()
このチャネルがクローズしている場合、このメソッドの戻り値は特定されません。
public abstract Object blockingLock()
configureBlocking
およびregister
メソッドが同期するオブジェクトを取得します。この機能は、特定のブロック・モードを短時間保持する必要があるアダプタを実装する場合に便利です。 バグまたは機能を送信
詳細なAPIリファレンスおよび開発者ドキュメントについては、Java SEのドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright© 1993, 2014, Oracle and/or its affiliates. All rights reserved.