クラスSelectableChannel

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

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

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

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

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

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

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

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

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

ブロック・モード

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

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

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

    コンストラクタ
    修飾子
    コンストラクタ
    説明
    protected
    このクラスの新しいインスタンスを初期化します。
  • メソッドのサマリー

    修飾子と型
    メソッド
    説明
    abstract Object
    configureBlockingおよびregisterメソッドが同期するオブジェクトを取得します。
    configureBlocking(boolean block)
    このチャネルのブロック・モードを調整します。
    abstract boolean
    このチャネル上の個々の入出力操作が前の入出力操作が完了するまでブロックされるかどうかを判断します。
    abstract boolean
    現在このチャネルがセレクタに登録されているかどうかを判断します。
    abstract SelectionKey
    チャネルが指定されたセレクタに登録されていることを示すキーを取得します。
    このチャネルの作成元プロバイダを返します。
    register(Selector sel, int ops)
    このチャネルを指定されたセレクタに登録し、選択キーを返します。
    abstract SelectionKey
    register(Selector sel, int ops, Object att)
    このチャネルを指定されたセレクタに登録し、選択キーを返します。
    abstract int
    このチャネルのサポートされている操作を識別する操作セットを返します。

    クラスで宣言されたメソッド AbstractInterruptibleChannel

    begin, close, end, implCloseChannel, isOpen
    修飾子と型
    メソッド
    説明
    protected final void
    無期限にブロックされる入出力操作の開始をマークします。
    final void
    現在のチャネルをクローズします。
    protected final void
    end(boolean completed)
    無期限にブロックされる入出力操作の終了をマークします。
    protected abstract void
    現在のチャネルをクローズします。
    final boolean
    現在のチャネルの状態がオープンであるかどうかを判断します。

    クラスオブジェクトで宣言されたメソッド

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    修飾子と型
    メソッド
    説明
    protected Object
    このオブジェクトのコピーを作成して、返します。
    boolean
    このオブジェクトと他のオブジェクトが等しいかどうかを示します。
    protected void
    削除予定のため非推奨: このAPI要素は、将来のバージョンで削除される可能性があります。
    最終決定は非推奨であり、将来のリリースで削除される可能性があります。
    final Class<?>
    このObjectの実行時クラスを返します。
    int
    このオブジェクトに対するハッシュ・コード値を返します。
    final void
    このオブジェクトのモニターで待機中のスレッドを1つ再開します。
    final void
    このオブジェクトのモニターで待機中のすべてのスレッドを再開します。
    オブジェクトの文字列表現を返します。
    final void
    現在のスレッドが目覚めるまで待機します。通常、notifiedまたはinterruptedです。
    final void
    wait(long timeoutMillis)
    現在のスレッドは、通常、notifiedまたはinterruptedであるか、一定のリアルタイムが経過するまで、目覚めるまで待機します。
    final void
    wait(long timeoutMillis, int nanos)
    現在のスレッドは、通常、notifiedまたはinterruptedであるか、一定のリアルタイムが経過するまで、目覚めるまで待機します。
  • コンストラクタの詳細

    • 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メソッドが同期するオブジェクトを取得します。 この機能は、特定のブロック・モードを短時間保持する必要があるアダプタを実装する場合に便利です。
      戻り値:
      ブロック・モードのロック・オブジェクト