JavaTM 2 Platform
Standard Ed. 5.0

java.nio.channels
クラス Selector

java.lang.Object
  上位を拡張 java.nio.channels.Selector
直系の既知のサブクラス:
AbstractSelector

public abstract class Selector
extends Object

SelectableChannel オブジェクトのマルチプレクサです。

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

セレクタに登録されている選択可能チャネルは、SelectionKey オブジェクトによって表示されます。セレクタが管理する選択キーのセットには、次の 3 種類があります。

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

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

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

選択操作を実行すると、選択されたキーセットにキーが追加されます。選択されたキーセットから直接キーを削除する場合は、選択されたキーセットの remove メソッドを呼び出すか、選択されたキーセットから取得可能な 反復子remove メソッドを呼び出します。それ以外の方法では、選択されたキーセットからキーを削除することはできません。また、選択操作の結果としてキーが削除されることはありません。選択されたキーセットに直接キーを追加することもできません。

選択

選択操作のたびに、セレクタの選択されたキーセットに対してキーの追加および削除が実行されるとともに、キーセットおよび取り消されたキーセットからキーが削除されます。選択は、 select()select(long)selectNow() のいずれかのメソッドにより、次の 3 段階の手順を経て行われます。

  1. 取り消されたキーセットに含まれるすべてのキーが所属する各キーセットから削除されるとともに、それらに対応するチャネルの登録もすべて解除されます。この手順が完了すると、取り消されたキーセットは空になります。

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

    1. 選択されたキーセット内にそのチャネルのキーが存在しなかった場合、選択されたキーセット内にそのキーが追加されるとともに、実行可能操作セットが変更され、そのチャネルで準備が整ったと報告された操作が登録される。それ以前に実行可能操作セットに記録されていた情報は破棄される

    2. そうでない場合は、そのチャネルのキーはすでに選択されたキーセット内に存在しているため、実行可能操作セットが変更され、そのチャネルで準備が整ったと報告された操作がすべて登録される。それ以前に実行可能操作セットに記録されていた情報は保存される。つまり、基本となるシステムから返された実行可能操作セットは現在の実行可能操作セットに「bitwise-disjoin (ビット単位での分離)」される

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

3 つの選択メソッドの本質的な違いは、1 個以上のチャネルの準備が整うまで選択操作がブロックされるかどうかと、ブロックされる場合にどのくらいの期間ブロックされるのか、の 2 点だけです。

並行性

セレクタ自体は、複数の並行スレッドで安全に使用できます。しかし、このことはキーセットには当てはまりません。

選択操作は、セレクタ自体、キーセット、選択されたキーセットをこの順番で同期化します。上記の手順 1 および 3 の実行時は、取り消されたキーセットを同期化します。

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

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

select()select(long) のいずれかのメソッドによってブロックされたスレッドに対してほかのスレッドから割り込みをかけるには、次の 3 つの方法のいずれかを使用します。

close メソッドは、セレクタと 3 つのキーセットすべてを選択操作時と同じ順番で同期化します。

通常、セレクタのキーセットおよび選択されたキーセットは、複数の並行スレッドで安全に使用できません。いずれかのセットを直接変更するスレッドがある場合、そのセットを同期化することによってアクセス制御を行う必要があります。これらのセットの iterator メソッドによって返される反復子は fail-fast です。反復子の作成後、反復子固有の remove メソッド呼び出し以外の方法でセットが変更された場合、ConcurrentModificationException がスローされます。

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

コンストラクタの概要
protected Selector()
          このクラスの新しいインスタンスを初期化します。
 
メソッドの概要
abstract  void close()
          このセレクタをクローズします。
abstract  boolean isOpen()
          このセレクタの状態がオープンであるかどうかを判断します。
abstract  Set<SelectionKey> keys()
          このセレクタのキーセットを返します。
static Selector open()
          セレクタをオープンします。
abstract  SelectorProvider provider()
          このチャネルの作成元プロバイダを返します。
abstract  int select()
          入出力操作の実行が可能な対応するチャネルを持つキーセットを選択します。
abstract  int select(long timeout)
          入出力操作の実行が可能な対応するチャネルを持つキーセットを選択します。
abstract  Set<SelectionKey> selectedKeys()
          このセレクタの選択されたキーセットを返します。
abstract  int selectNow()
          入出力操作の実行が可能な対応するチャネルを持つキーセットを選択します。
abstract  Selector wakeup()
          まだ終了していない最初の選択操作をただちに終了させます。
 
クラス java.lang.Object から継承されたメソッド
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

コンストラクタの詳細

Selector

protected Selector()
このクラスの新しいインスタンスを初期化します。

メソッドの詳細

open

public static Selector open()
                     throws IOException
セレクタをオープンします。

新しいセレクタは、システム全体のデフォルトの SelectorProvider オブジェクトの openSelector メソッドを呼び出すと作成されます。

戻り値:
新しいセレクタ
例外:
IOException - 入出力エラーが発生した場合

isOpen

public abstract boolean isOpen()
このセレクタの状態がオープンであるかどうかを判断します。

戻り値:
このセレクタがオープンである場合に限り true

provider

public abstract SelectorProvider provider()
このチャネルの作成元プロバイダを返します。

戻り値:
このチャネルの作成元プロバイダ

keys

public abstract Set<SelectionKey> keys()
このセレクタのキーセットを返します。

キーセットを直接変更することはできません。キーを取り消したあと、チャネルの登録が解除された時点で、そのキーが削除されます。キーセットを変更を試みると、 UnsupportedOperationException がスローされます。

キーセットはスレッドセーフではありません

戻り値:
このセレクタのキーセット
例外:
ClosedSelectorException - このセレクタがクローズしている場合

selectedKeys

public abstract Set<SelectionKey> selectedKeys()
このセレクタの選択されたキーセットを返します。

選択されたキーセットに対して、キーの削除は行えますが、キーを直接追加することはできません。選択されたキーセットに対してオブジェクトの追加を試みると、 UnsupportedOperationException がスローされます。

選択されたキーセットはスレッドセーフではありません

戻り値:
このセレクタの選択されたキーセット
例外:
ClosedSelectorException - このセレクタがクローズしている場合

selectNow

public abstract int selectNow()
                       throws IOException
入出力操作の実行が可能な対応するチャネルを持つキーセットを選択します。

このメソッドは、非ブロック型の選択操作を実行します。前回の選択操作以降、選択可能になれるチャネルが存在しない場合、このメソッドはただちにゼロを返します。

このメソッドを呼び出すと、以前に呼び出した wakeup メソッドの結果がクリアされます。

戻り値:
選択操作によって更新された実行可能操作セットを持つキーの数。ゼロの場合もある
例外:
IOException - 入出力エラーが発生した場合
ClosedSelectorException - このセレクタがクローズしている場合

select

public abstract int select(long timeout)
                    throws IOException
入出力操作の実行が可能な対応するチャネルを持つキーセットを選択します。

このメソッドは、ブロック型の選択操作を実行します。このメソッドは、1 個以上のチャネルが選択された場合、このセレクタの wakeup メソッドが呼び出された場合、現在のスレッドに対して割り込みが発生した場合、または指定のタイムアウト期間が終了した場合に限り終了します。

このメソッドはリアルタイム保証を行いません。Object.wait(long) メソッド呼び出しと同様にタイムアウトのスケジュールを作成します。

パラメータ:
timeout - 正の数の場合、チャネルが実行可能状態になるのを待機する間、ブロックされるのは最大でおよそ timeout ミリ秒、ゼロの場合無期限のブロック。負の数は指定できない
戻り値:
更新された実行可能操作セットを持つキーの数。ゼロの場合もある
例外:
IOException - 入出力エラーが発生した場合
ClosedSelectorException - このセレクタがクローズしている場合
IllegalArgumentException - timeout 引数の値が負の場合

select

public abstract int select()
                    throws IOException
入出力操作の実行が可能な対応するチャネルを持つキーセットを選択します。

このメソッドは、ブロック型の選択操作を実行します。このメソッドは、1 個以上のチャネルが選択された場合、このセレクタの wakeup メソッドが呼び出された場合、または現在のスレッドに対して割り込みが発生した場合に限り終了します。

戻り値:
更新された実行可能操作セットを持つキーの数。ゼロの場合もある
例外:
IOException - 入出力エラーが発生した場合
ClosedSelectorException - このセレクタがクローズしている場合

wakeup

public abstract Selector wakeup()
まだ終了していない最初の選択操作をただちに終了させます。

select() メソッドまたは select(long) メソッドの呼び出し時にその他のスレッドがブロックされていると、呼び出しはすぐに終了します。現在実行中の選択操作がない場合は、事前に selectNow() メソッドを呼び出さないかぎり、次回呼び出し時もこれらのメソッドはすぐに終了します。この呼び出しの戻り値は、いずれの場合もゼロ以外の値です。それ以降、次回呼び出し時までにこのメソッドを再度呼び出さないかぎり、select() メソッドまたは select(long) メソッドの呼び出しは通常どおりブロックされます。

ある選択操作から次の選択操作までの間にこのメソッドを 1 回以上呼び出しても、1 回だけ呼び出したときと同じ結果になります。

戻り値:
このセレクタ

close

public abstract void close()
                    throws IOException
このセレクタをクローズします。

このセレクタの選択メソッド内でブロックされているスレッドがある場合、セレクタの wakeup メソッドを呼び出した場合と同様に、このスレッドに対する割り込みが発生します。

取り消されておらず、セレクタに関連付けられたままのキーは、無効になります。チャネルの登録は解除され、このセレクタに関連したその他のすべてのリソースが解放されます。

セレクタがクローズしている状態でこのメソッドを呼び出しても、何の効果もありません。

いったんクローズしたセレクタを再度利用しようとすると、このメソッドまたは wakeup メソッドを呼び出す場合を除き、ClosedSelectorException がスローされます。

例外:
IOException - 入出力エラーが発生した場合

JavaTM 2 Platform
Standard Ed. 5.0

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

Copyright 2004 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。