JavaTM Platform
Standard Ed. 6

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

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

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

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

並行性

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

選択操作は、セレクタ自体、キーセット、選択されたキーセットをこの順番で同期化します。上記の手順 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) メソッドの呼び出しは通常どおりブロックされます。

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

戻り値:
このセレクタ

close

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

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

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

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

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

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

JavaTM Platform
Standard Ed. 6

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

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