JavaTM 2
Platform
Std. Ed. v1.4.0

java.nio.channels
クラス SelectableChannel

java.lang.Object
  |
  +--java.nio.channels.spi.AbstractInterruptibleChannel
        |
        +--java.nio.channels.SelectableChannel
すべての実装インタフェース:
Channel, InterruptibleChannel
直系の既知のサブクラス:
AbstractSelectableChannel

public abstract class SelectableChannel
extends AbstractInterruptibleChannel
implements Channel

Selector 経由で多重化できるチャネルです。

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

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

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

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

セレクタ 1 個に対して最大 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, isOpen
 
クラス java.lang.Object から継承したメソッド
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 
インタフェース java.nio.channels.Channel から継承したメソッド
close, isOpen
 

コンストラクタの詳細

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)
チャネルが指定されたセレクタに登録されていることを示すキーを取得します。

戻り値:
前回このチャネルを指定されたセレクタに登録したとき返されたキー。現在このチャネルが指定されたセレクタに登録されていない場合は 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 - このチャネルがクローズしている場合
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 - このチャネルがクローズしている場合
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 メソッドが同期するオブジェクトを返します。この機能は、特定のブロックモードを短時間保持する必要があるアダプタを実装する場合に便利です。

戻り値:
ブロックモードのロックオブジェクト

JavaTM 2
Platform
Std. Ed. v1.4.0

バグの報告と機能のリクエスト
これ以外の API リファレンスおよび開発者用ドキュメントについては、 Java 2 SDK SE 開発者用ドキュメントを参照してください。 開発者向けの詳細な解説、概念の概要、用語の定義、バグの回避策、 およびコード実例が含まれています。

Java、Java 2D、および JDBC は米国ならびにその他の国における米国 Sun Microsystems, Inc. の商標もしくは登録商標です。
Copyright 1993-2002 Sun Microsystems, Inc. 901 San Antonio Road
Palo Alto, California, 94303, U.S.A. All Rights Reserved.