- すべての実装されたインタフェース:
Closeable
,AutoCloseable
,Channel
,InterruptibleChannel
- 直系の既知のサブクラス:
AbstractSelectableChannel
public abstract class SelectableChannel extends AbstractInterruptibleChannel implements Channel
Selector
経由で多重化できるチャネルです。
セレクタで使用するためには、まず、register
メソッドを使ってこのクラスのインスタンスを登録する必要があります。 このメソッドは、セレクタへのチャネルの登録を表す新しいSelectionKey
オブジェクトを返します。
セレクタに登録されたチャネルは、登録を解除するまで登録されたままになります。 登録を解除するには、セレクタによってチャネルに割り当てられたリソースを解放する必要があります。
チャネルの登録を直接解除することはできません。その代わりに、登録を表すキーを取り消します。 キーを取り消すには、セレクタが次の選択を行っている間にチャネルの登録を解除します。 キーは、cancel
メソッドを呼び出すことで明示的に取り消すことができます。 close
メソッドの呼び出し、またはチャネル上の入出力操作中にブロックされたスレッドに対する割り込みによってチャネルをクローズすると、必然的に、そのチャネルのすべてのキーが取り消されます。
セレクタ自体をクローズすると、チャネルの登録が解除され、その登録を示していたキーも即座に無効になります。
チャネルは特定のセレクタに対して、多くても一度しか登録できません。
チャネルが1個以上のセレクタに登録されていないかどうかを確認するには、isRegistered
メソッドを呼び出します。
選択可能チャネルは、複数の並行スレッドで安全に使用できます。
ブロック・モード
選択可能チャネルは、ブロック・モードか非ブロック・モードになります。 ブロック・モードの場合、チャネル上で呼び出された入出力操作は、前の操作が完了するまでブロックされます。 非ブロック・モードの場合、入出力操作はブロックされず、要求されたバイト数より少ないバイト数が転送されます。バイトが一切転送されない場合もあります。 選択可能チャネルがブロック・モードであるかどうかは、isBlocking
メソッドを呼び出すことで判断できます。
新しく作成された選択可能チャネルは、常にブロック・モードになります。 非ブロック・モードは、セレクタ・ベースの多重化と共にもっとも有用です。 セレクタに登録する前に、チャネルを非ブロック・モードにし、登録解除までそのままにしておく必要があります。
- 導入されたバージョン:
- 1.4
- 関連項目:
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()
このチャネルのサポートされている操作を識別する操作セットを返します。クラス java.nio.channels.spi.AbstractInterruptibleChannelで宣言されたメソッド
begin, close, end, implCloseChannel
-
コンストラクタの詳細
-
SelectableChannel
protected SelectableChannel()このクラスの新しいインスタンスを初期化します。
-
-
メソッドの詳細
-
provider
public abstract SelectorProvider provider()このチャネルの作成元プロバイダを返します。- 戻り値:
- このチャネルの作成元プロバイダ
-
validOps
public abstract int validOps()このチャネルのサポートされている操作を識別する操作セットを返します。 この整数値に設定されているビットは、このチャネルにとって有効な操作を示します。 このメソッドは、指定された具象チャネル・クラスに対して、常に同じ値を返します。- 戻り値:
- 有効な操作セット
-
isRegistered
public abstract boolean isRegistered()現在このチャネルがセレクタに登録されているかどうかを判断します。 新しく作成されたチャネルは登録されていません。キーの取り消しからチャネルの登録解除までの間に発生する必然的な遅延のため、キーをすべて取り消しても、しばらくの間チャネルの登録は解除されません。 チャネルをクローズしたときも同様です。
- 戻り値:
- このチャネルが登録されている場合にかぎり
true
-
keyFor
public abstract SelectionKey keyFor(Selector sel)チャネルが指定されたセレクタに登録されていることを示すキーを取得します。- パラメータ:
sel
- セレクタ- 戻り値:
- 前回このチャネルを指定されたセレクタに登録したとき返されたキー。現在このチャネルが指定されたセレクタに登録されていない場合は
null
-
register
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
の場合)
-
register
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
の場合)
-
configureBlocking
public abstract SelectableChannel configureBlocking(boolean block) throws IOExceptionこのチャネルのブロック・モードを調整します。このチャネルが1個以上のセレクタに登録されている場合、ブロック・モードに設定しようとすると、
IllegalBlockingModeException
がスローされます。このメソッドはいつでも呼び出すことができます。 新しいブロック・モードは、このメソッドの終了後に開始された入出力操作だけに影響を及ぼします。 実装によっては、保留された入出力操作が完了するまでブロックを続行する必要があります。
このメソッドの呼出し中、または
register
メソッドの呼出し中に重複してこのメソッドを呼び出した場合、新しく呼び出したメソッドは最初のメソッドの処理が完了するまでブロックされます。- パラメータ:
block
-true
の場合はこのチャネルがブロック・モードになり、false
の場合は非ブロック・モードになる- 戻り値:
- この選択可能チャネル
- 例外:
ClosedChannelException
- このチャネルがクローズしている場合IllegalBlockingModeException
-block
がtrue
で、このチャネルが1個以上のセレクタに登録されている場合IOException
- 入出力エラーが発生した場合
-
isBlocking
public abstract boolean isBlocking()このチャネル上の個々の入出力操作が前の入出力操作が完了するまでブロックされるかどうかを判断します。 新しく作成されたチャネルは常にブロック・モードです。このチャネルがクローズしている場合、このメソッドの戻り値は特定されません。
- 戻り値:
- このチャネルがブロック・モードである場合にかぎり
true
-
blockingLock
public abstract Object blockingLock()configureBlocking
およびregister
メソッドが同期するオブジェクトを取得します。 この機能は、特定のブロック・モードを短時間保持する必要があるアダプタを実装する場合に便利です。- 戻り値:
- ブロック・モードのロック・オブジェクト
-