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

クラスSelector

java.lang.Object
java.nio.channels.Selector
すべての実装されたインタフェース:
Closeable, AutoCloseable
直系の既知のサブクラス:
AbstractSelector

public abstract class Selector extends Object implements Closeable
SelectableChannelオブジェクトのマルチプレクサです。

セレクタを作成するには、このクラスのopenメソッドを呼び出します。このメソッドは、システムのデフォルトのセレクタ・プロバイダを使って新しいセレクタを作成します。 セレクタは、カスタム・セレクタ・プロバイダのopenSelectorメソッドを呼び出して作成することもできます。 セレクタは、closeメソッドでクローズされるまでオープンの状態を維持します。

SelectionKeyオブジェクトは、選択可能チャネルがセレクタに登録されていることを示します。 セレクタは選択キーの3つのセットを管理します。

  • キー・セット。現在このセレクタに登録されているチャネルを示すキーで構成されます。 このセットはkeysメソッドによって返されます。

  • 「選択されたキー・セット」は、キーの追加またはキーの更新を行う前の選択操作で設定された操作のうち少なくとも1つの操作に対して、各キー・チャネルが準備できていることが検出される、キーのセットです。 このセットはselectedKeysメソッドによって返されます。 常にキー・セットのサブセットになります。

  • 取り消されたキー・セット。チャネルの登録はまだ解除されていないが、取消しは完了しているキーのセットです。 このセットに直接アクセスすることはできません。 常にキー・セットのサブセットになります。

新しく作成されたセレクタでは、この3つのセットは空です。

チャネルのregisterメソッドを使ってチャネルを登録すると、その副作用としてセレクタのキー・セットにキーが追加されます。 取り消されたキーは、選択時にキー・セットから削除されます。 キー・セット自体を直接変更することはできません。

チャネルのクローズやcancelメソッドの呼出しによってキーを取り消すと、このキーがセレクタの取り消されたキー・セットに追加されます。 キーを取り消すと、次の選択操作中にそのチャネルが登録解除され、その時点ですべてのセレクタ・キー・セットからキーが削除されます。

キーは、選択操作によって選択されたキー・セットに追加されます。 選択されたキー・セットから直接キーを削除する場合は、このセットのremoveメソッドを呼び出すか、このセットから取得されたイテレータremoveメソッドを呼び出します。 すべてのキーは、set clearメソッドを起動することによって、選択されたキー・セットから削除できます。 また、選択されたキー・セットに直接キーを追加することもできません。

選択項目

選択操作は、基礎となるオペレーティング・システムに対して、登録済の各チャネルの準備として更新を問い合せ、そのキー関心セットによって識別された操作を実行します。 選択操作には2つの形式があります。

  1. select()select(long)およびselectNow()メソッドは、操作を実行する準備ができたチャネルのキーを、選択されたキー・セットに追加するか、すでに選択されたキー・セットにすでに存在するキーのすぐに操作セットを更新します。

  2. select(Consumer)select(Consumer, long)およびselectNow(Consumer)メソッドは、操作の実行準備ができている各チャネルのキーに対してactionを実行します。 これらのメソッドは、選択されたキー・セットには追加されません。

選択されたキー・セットに追加される選択操作

選択のたびに、セレクタの選択されたキー・セットにキーが追加されたり、キー・セットや取り消されたキー・セットからキーが削除されたりします。 選択は、select()select(long)、およびselectNow()メソッドにより、3ステップを経て行われます。

  1. 取り消されたキー・セットに含まれるすべてのキーが各キー・セットから削除され、チャネルの登録が解除されます。 このステップにより、取り消されたキー・セットは空になります。

  2. 選択操作が開始された時点で、キーの対象セットに示されたいずれかの操作を実行できる状態のチャネルが更新されたかどうかについて、基本となるオペレーティング・システムが照会されます。 該当するチャネルに対しては、次のいずれかのアクションが実行されます。

    1. 選択されたキー・セットから削除されたチャネルのキーがセットに追加され、現在このチャネルで実行可能な操作がわかるように実行可能操作セットが変更されます。 それ以前に実行可能セットに記録された情報は破棄されます。

    2. それ以外の場合、チャネルのキーはすでに選択されたキー・セット内にあります。したがって、実行可能操作セットは、チャネルが実行できる新しい操作がわかるように変更されます。 それ以前に実行可能セットに記録された情報は保存されます。つまり、基本となるシステムから返される実行可能セットは、ビット単位で現在の実行可能セットに分離されます。

    このステップの開始時に、キー・セット内のすべてのキーの対象セットが空になっている場合、選択されたキー・セットもキーの実行可能操作セットも更新されません。
  3. ステップ(2)の実行中に取り消されたキー・セットに追加されたキーは、ステップ(1)に従って処理されます。

3つの選択メソッドは、1個以上のチャネルが実行可能な状態になるまで選択操作がブロックされるかどうか、ブロックされる場合はどのくらいの期間ブロックされるのかという点以外は本質的に同じです。

選択したキーに対してアクションを実行する選択操作

選択操作のたびに、セレクタ・キー・セット、選択されたキー・セット、および取り消されたキー・セットからキーが削除されます。 選択はselect(Consumer)select(Consumer,long)およびselectNow(Consumer)メソッドによって実行され、3つのステップが含まれます。

  1. 取り消されたキー・セットに含まれるすべてのキーが各キー・セットから削除され、チャネルの登録が解除されます。 このステップにより、取り消されたキー・セットは空になります。

  2. 選択操作が開始された時点で、キーの対象セットに示されたいずれかの操作を実行できる状態のチャネルが更新されたかどうかについて、基本となるオペレーティング・システムが照会されます。

    そのような操作を1つ以上実行できる状態のチャネルの場合、チャネル・キーのすぐに操作セットは、チャネルの準備ができている操作を正確に識別するように設定され、selectメソッドに指定されたactionはチャネル・キーを使用するために起動されます。 以前にreadyセットに記録された準備情報は、actionを起動する前に破棄されます。

    また、チャネルが複数の操作の準備が完了している場合、actionは、チャネルの準備ができている操作のサブセットに変更が設定されているチャネル・キーおよびパッシブ操作を使用して、複数回呼び出すことができます。 同じキーに対してactionが2回以上呼び出された場合、同じ選択操作でのactionへの直前の呼出しでセットに含まれていた操作ビットは、すぐには含まれません。

  3. ステップ(2)の実行中に取り消されたキー・セットに追加されたキーは、ステップ(1)に従って処理されます。

同時実行性

セレクタとそのキー・セットは、複数の同時スレッドで安全に使用できます。 ただし、その選択されたキー・セットと取消し済キー・セットは対象となりません。

選択操作は、選択されたキー・セットでその順序でセレクタ自体に対して同期化されます。 上記のステップ1および3の実行時は、取り消されたキー・セットを同期化します。

選択操作の実行中にセレクタのキーの対象セットに変更を加えても、変更が適用されるのは次の選択操作からであり、現在実行中の操作に影響はありません。

キーの取り消しやチャネルのクローズはいつでも実行できます。 あるキーが1個以上のセレクタのキー・セット内に存在していても、そのキーが有効で、チャネルがオープンしているとは限りません。 別のスレッドによってキーが取り消されたり、チャネルがクローズされる可能性がある場合は、アプリケーション・コードの同期化を慎重に行い、必要に応じてその状態をチェックする必要があります。

選択操作でブロックされたスレッドは、次の3つのいずれかの方法で他のスレッドによって中断される可能性があります。

  • セレクタのwakeupメソッドの呼出し。

  • セレクタのcloseメソッドの呼出し

  • ブロックされたスレッドのinterruptメソッドの呼出し。この場合、割込みステータスが設定され、セレクタのwakeupメソッドが呼び出されます。

closeメソッドは、選択操作と同じ順序でセレクタおよびその選択されたキー・セットに対して同期化を行います。

セレクタ・キー・セットは、複数の同時スレッドで安全に使用できます。 キー・セットからの取得操作は、通常はブロックされないため、セットに追加された新しい登録や、セットからキーを削除する選択操作の取消しステップによって重複する可能性があります。 イテレータおよびスプリッテレータは、イテレータ/スプリッテレータの作成以降、ある時点またはそれ以降のセットの状態を反映して要素を戻します。 これらがConcurrentModificationExceptionをスローすることはありません。

選択されたセレクタ・キー・セットは、通常、複数の同時スレッドで使用しても安全ではありません。 このようなスレッドがセットを直接変更する可能性がある場合は、セット自体の同期化によってアクセスを制御する必要があります。 セットiteratorメソッドによって戻されるイテレータは、イテレータの作成後にセットが変更された場合は、イテレータ自体のremoveメソッドを起動する以外に、ConcurrentModificationExceptionがスローされます。

導入されたバージョン:
1.4
関連項目: