モジュール java.base
パッケージ java.nio.channels

クラスSelectableChannel

すべての実装されたインタフェース:
Closeable, AutoCloseable, Channel, InterruptibleChannel
直系の既知のサブクラス:
AbstractSelectableChannel

public abstract class SelectableChannel extends AbstractInterruptibleChannel implements Channel
Selector経由で多重化できるチャネルです。

セレクタで使用するためには、まず、registerメソッドを使ってこのクラスのインスタンスを登録する必要があります。 このメソッドは、セレクタへのチャネルの登録を表す新しいSelectionKeyオブジェクトを返します。

セレクタに登録されたチャネルは、登録を解除するまで登録されたままになります。 登録を解除するには、セレクタによってチャネルに割り当てられたリソースを解放する必要があります。

チャネルの登録を直接解除することはできません。その代わりに、登録を表すキーを取り消します キーを取り消すには、セレクタが次の選択を行っている間にチャネルの登録を解除します。 キーは、cancelメソッドを呼び出すことで明示的に取り消すことができます。 closeメソッドの呼び出し、またはチャネル上の入出力操作中にブロックされたスレッドに対する割り込みによってチャネルをクローズすると、必然的に、そのチャネルのすべてのキーが取り消されます。

セレクタ自体をクローズすると、チャネルの登録が解除され、その登録を示していたキーも即座に無効になります。

チャネルは特定のセレクタに対して、多くても一度しか登録できません。

チャネルが1個以上のセレクタに登録されていないかどうかを確認するには、isRegisteredメソッドを呼び出します。

選択可能チャネルは、複数の並行スレッドで安全に使用できます。

ブロック・モード

選択可能チャネルは、ブロック・モードか非ブロック・モードになります。 ブロック・モードの場合、チャネル上で呼び出された入出力操作は、前の操作が完了するまでブロックされます。 非ブロック・モードの場合、入出力操作はブロックされず、要求されたバイト数より少ないバイト数が転送されます。バイトが一切転送されない場合もあります。 選択可能チャネルがブロック・モードであるかどうかは、isBlockingメソッドを呼び出すことで判断できます。

新しく作成された選択可能チャネルは、常にブロック・モードになります。 非ブロック・モードは、セレクタ・ベースの多重化と共にもっとも有用です。 セレクタに登録する前に、チャネルを非ブロック・モードにし、登録解除までそのままにしておく必要があります。

導入されたバージョン:
1.4
関連項目:
SelectionKeySelector
  • コンストラクタの詳細

    • 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 - blocktrueで、このチャネルが1個以上のセレクタに登録されている場合
      IOException - 入出力エラーが発生した場合
    • isBlocking

      public abstract boolean isBlocking()
      このチャネル上の個々の入出力操作が前の入出力操作が完了するまでブロックされるかどうかを判断します。 新しく作成されたチャネルは常にブロック・モードです。

      このチャネルがクローズしている場合、このメソッドの戻り値は特定されません。

      戻り値:
      このチャネルがブロック・モードである場合にかぎりtrue
    • blockingLock

      public abstract Object blockingLock()
      configureBlockingおよびregisterメソッドが同期するオブジェクトを取得します。 この機能は、特定のブロック・モードを短時間保持する必要があるアダプタを実装する場合に便利です。
      戻り値:
      ブロック・モードのロック・オブジェクト