Selector クラス
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
SelectableChannel オブジェクトのマルチプレクサー。
[Android.Runtime.Register("java/nio/channels/Selector", DoNotGenerateAcw=true)]
public abstract class Selector : Java.Lang.Object, IDisposable, Java.Interop.IJavaPeerable, Java.IO.ICloseable
[<Android.Runtime.Register("java/nio/channels/Selector", DoNotGenerateAcw=true)>]
type Selector = class
inherit Object
interface ICloseable
interface IJavaObject
interface IDisposable
interface IJavaPeerable
- 継承
- 派生
- 属性
- 実装
注釈
SelectableChannel オブジェクトのマルチプレクサー。
セレクターは、システムの既定のjava.nio.channels.spi.SelectorProvider selector providerを使用して新しいセレクターを作成するこのクラスの#open open メソッドを呼び出すことによって作成できます。 セレクターは、カスタム セレクター プロバイダーの java.nio.channels.spi.SelectorProvider#openSelector openSelector メソッドを呼び出すことによっても作成できます。 セレクターは、 #close close メソッドによって閉じられるまで開いたままです。
"ks">
セレクターに対する選択可能なチャネルの登録は、 SelectionKey オブジェクトによって表されます。 セレクターは、次の 3 つの選択キーセットを保持します。
<ul>
<li>
キー セットには、このセレクターの現在のチャネル登録を表すキーが含まれています。 このセットは、 #keys() keys メソッドによって返されます。
</li>
<li>
選択されたキー セットは、各キーのチャネルが、キーを追加したり、セット内のキーを更新したりする前の選択操作の間に、キーの対象セットで特定された操作の少なくとも 1 つに対して準備ができていることが検出されるようにするキーのセットです。 このセットは、 #selectedKeys() selectedKeys メソッドによって返されます。 選択したキー セットは、常にキー セットのサブセットです。
</li>
<li>
cancelled-key セットは、取り消されたがチャネルがまだ登録解除されていないキーのセットです。 このセットには直接アクセスできません。 取り消されたキー セットは、常にキー セットのサブセットです。
</li>
</ul>
新しく作成されたセレクターでは、3 つのセットはすべて空です。
チャネルの SelectableChannel#register(Selector,int) register メソッドを使用してチャネルを登録する副作用として、セレクターのキー セットにキーが追加されます。 取り消されたキーは、選択操作中にキー セットから削除されます。 キー セット自体は直接変更できません。
キーは、チャネルを閉じるか、 SelectionKey#cancel cancel メソッドを呼び出すかに関係なく、取り消されたときにセレクターの cancelled-key セットに追加されます。 キーを取り消すと、次の選択操作中にチャネルが登録解除され、その時点でキーがセレクターのすべてのキー セットから削除されます。
"sks">
キーは、選択操作によって選択されたキー セットに追加されます。 キーは、セットのjava.util.Set#remove(java.lang.Object) remove メソッドを呼び出すか、セットから取得したjava.util.Iterator iteratorのjava.util.Iterator#remove() remove メソッドを呼び出すことによって、選択したキー セットから直接削除できます。 選択したキー セットからすべてのキーを削除するには、セットの java.util.Set#clear() clear メソッドを呼び出します。 選択したキー セットにキーを直接追加することはできません。
"selop"><h2>Selection</h2>
選択操作では、基になるオペレーティング システムに対して、登録されている各チャネルの準備状況に関する更新を照会して、キーの関心セットによって識別される操作を実行します。 選択操作には、次の 2 つの形式があります。
<ol>
<li>
#select()、#select(long)、および#selectNow()メソッドは、選択したキー セットに操作を実行する準備ができているチャネルのキーを追加するか、選択したキー セットに既に含まれているキーの準備完了のセットを更新します。
</li>
<li>
#select(Consumer)、#select(Consumer, long)、および#selectNow(Consumer)メソッドは、操作を実行する準備ができている各チャネルのキーに対してアクションを実行します。 これらのメソッドは、選択したキー セットには追加されません。
</li>
</ol>
<h3>選択キー セットに追加する選択操作</h3>
選択操作のたびに、セレクターの選択キー セットにキーを追加したり、セレクターの選択キー セットからキーを削除したり、キーセットや取り消しキー セットから削除したりできます。 選択は、 #select()、 #select(long)、および #selectNow() のメソッドによって実行され、次の 3 つの手順が含まれます。
<ol>
<li>
取り消されたキー セット内の各キーは、メンバーである各キー セットから削除され、そのチャネルは登録解除されます。 この手順では、cancelled キー セットは空のままになります。
</li>
<li>
基になるオペレーティング システムは、選択操作が開始された時点でキーの関心セットによって識別される操作を実行するために、残りの各チャネルの準備状況に関する更新プログラムを照会します。 このような操作の少なくとも 1 つの準備ができているチャネルでは、次の 2 つのアクションのいずれかが実行されます。
<ol>
<li>
チャネルのキーがまだ選択されたキー セットに含まれていない場合は、そのセットに追加され、その準備完了操作セットが変更され、チャネルが準備完了と報告された操作を正確に識別します。 準備完了セットに以前に記録された準備情報はすべて破棄されます。
</li>
<li>
それ以外の場合、チャネルのキーは既に選択されたキー セット内に存在するため、その準備完了操作セットが変更され、チャネルが準備完了と報告された新しい操作が識別されます。 準備完了セットに以前に記録された準備情報はすべて保持されます。つまり、基になるシステムによって返される準備完了セットは、キーの現在の準備完了セットにビットごとの不整合が発生します。
</li>
</ol>
この手順の開始時にキー セット内のすべてのキーに空の関心セットがある場合、選択したキー セットも、キーの準備完了操作セットも更新されません。
<li>
ステップ (2) の進行中に cancelled-key セットにキーが追加された場合は、手順 (1) のように処理されます。
</li>
</ol>
選択操作が 1 つ以上のチャネルの準備が整うのを待つのをブロックするかどうかと、その場合は、3 つの選択方法の唯一の重要な違いです。
<h3>選択したキーに対してアクションを実行する選択操作</h3>
選択操作のたびに、セレクターのキー、選択したキー、および取り消されたキー セットからキーを削除できます。 選択は、 #select(Consumer)、 #select(Consumer,long)、および #selectNow(Consumer) のメソッドによって実行され、次の 3 つの手順が含まれます。
<ol>
<li>
取り消されたキー セット内の各キーは、メンバーである各キー セットから削除され、そのチャネルは登録解除されます。 この手順では、cancelled キー セットは空のままになります。
</li>
<li>
基になるオペレーティング システムは、選択操作が開始された時点でキーの関心セットによって識別される操作を実行するために、残りの各チャネルの準備状況に関する更新プログラムを照会します。
このような操作の少なくとも 1 つの準備ができているチャネルの場合、チャネルのキーの準備完了操作セットは、チャネルの準備ができている操作を正確に識別するように設定され、チャネルのキーを使用するために select メソッドに指定されたアクションが呼び出されます。 既に準備完了セットに記録されていた準備情報は、 アクションを呼び出す前に破棄されます。
または、チャネルが複数の操作の準備ができている場合は、チャネルのキーと準備完了操作セットをチャネルの準備ができている操作のサブセットに変更して、 アクション を複数回呼び出すことができます。 同じキーに対して アクション が複数回呼び出された場合、その準備完了操作セットには、同じ選択操作の前のアクションの呼び出し時にセットに含まれていた 操作 ビットが含まれることはありません。
</li>
<li>
ステップ (2) の進行中に cancelled-key セットにキーが追加された場合は、手順 (1) のように処理されます。
</li>
</ol>
<h2>Concurrency</h2>
セレクターとそのキー セットは、複数の同時実行スレッドで安全に使用できます。 ただし、選択されたキー セットと cancelled-key セットは選択されていません。
選択操作は、選択したキー セットのセレクター自体で、その順序で同期されます。 また、上記の手順 (1) と (3) の間に、取り消されたキー セットでも同期されます。
選択操作の進行中にセレクターのキーの関心セットに加えられた変更は、その操作には影響しません。これらは、次の選択操作で表示されます。
キーは取り消され、チャネルはいつでも閉じられる場合があります。 そのため、セレクターの 1 つ以上のキー セットにキーが存在しても、キーが有効であるか、そのチャネルが開いているという意味ではありません。 アプリケーション コードでは、別のスレッドがキーを取り消したりチャネルを閉じたりする可能性がある場合は、必要に応じてこれらの条件を同期して確認するように注意する必要があります。
選択操作でブロックされたスレッドは、次の 3 つの方法のいずれかで他のスレッドによって中断される可能性があります。
<ul>
<li>
セレクターの #wakeup wakeup メソッドを呼び出すことによって、
</li>
<li>
セレクターの #close close メソッドを呼び出すことにより、または
</li>
<li>
ブロックされたスレッドの java.lang.Thread#interrupt() interrupt メソッドを呼び出すことによって、その割り込み状態が設定され、セレクターの #wakeup wakeup メソッドが呼び出されます。
</li>
</ul>
#close close メソッドは、選択操作と同じ順序でセレクターとその選択キー セットで同期します。
"ksc">
セレクターのキー セットは、複数の同時実行スレッドで安全に使用できます。 キー セットからの取得操作は通常ブロックされないため、セットに追加する新しい登録や、セットからキーを削除する選択操作のキャンセル手順と重複する可能性があります。 反復子と分割子は、反復子/分割子の作成後のある時点でのセットの状態を反映する要素を返します。 彼らは java.util.ConcurrentModificationException ConcurrentModificationExceptionをスローしません。
"sksc">
セレクターの選択キー セットは、通常、複数の同時実行スレッドで安全に使用できません。 このようなスレッドがセットを直接変更する可能性がある場合は、セット自体で同期することによってアクセスを制御する必要があります。 セットの java.util.Set#iterator() iterator メソッドによって返される反復子は 高速で失敗 します。反復子の作成後にセットが変更された場合、反復子独自の java.util.Iterator#remove() remove メソッドを呼び出す以外の方法で、 java.util.ConcurrentModificationException がスローされます。
1.4 で追加されました。
このページの一部は、によって作成および共有され、に記載されている条件に従って使用される作業に基づく変更です。
コンストラクター
| 名前 | 説明 |
|---|---|
| Selector() |
このクラスの新しいインスタンスを初期化します。 |
| Selector(IntPtr, JniHandleOwnership) |
JNI オブジェクトのマネージド表現を作成するときに使用されるコンストラクター。ランタイムによって呼び出されます。 |
プロパティ
| 名前 | 説明 |
|---|---|
| Class |
この |
| Handle |
基になる Android インスタンスへのハンドル。 (継承元 Object) |
| IsOpen |
このセレクターが開いているかどうかを示します。 |
| JniIdentityHashCode |
|
| JniPeerMembers |
|
| PeerReference |
|
| ThresholdClass |
この API は Android 用 Mono インフラストラクチャをサポートしており、コードから直接使用するためのものではありません。 |
| ThresholdType |
この API は Android 用 Mono インフラストラクチャをサポートしており、コードから直接使用するためのものではありません。 |
メソッド
| 名前 | 説明 |
|---|---|
| Clone() |
このオブジェクトのコピーを作成して返します。 (継承元 Object) |
| Close() |
このセレクターを閉じます。 |
| Dispose() |
|
| Dispose(Boolean) |
|
| Equals(Object) |
他のオブジェクトがこのオブジェクトと "等しい" かどうかを示します。 (継承元 Object) |
| GetHashCode() |
オブジェクトのハッシュ コード値を返します。 (継承元 Object) |
| JavaFinalize() |
オブジェクトへの参照がなくなったとガベージ コレクションによって判断されたときに、オブジェクトのガベージ コレクターによって呼び出されます。 (継承元 Object) |
| Keys() |
このセレクターのキー セットを返します。 |
| Notify() |
このオブジェクトのモニターで待機している 1 つのスレッドを起動します。 (継承元 Object) |
| NotifyAll() |
このオブジェクトのモニターで待機しているすべてのスレッドを起動します。 (継承元 Object) |
| Open() |
セレクターを開きます。 |
| Provider() |
このチャネルを作成したプロバイダーを返します。 |
| Select() |
対応するチャネルが I/O 操作の準備ができているキーのセットを選択します。 |
| Select(IConsumer, Int64) |
対応するチャネルが I/O 操作の準備ができているキーに対してアクションを選択して実行します。 |
| Select(IConsumer) |
対応するチャネルが I/O 操作の準備ができているキーに対してアクションを選択して実行します。 |
| Select(Int64) |
対応するチャネルが I/O 操作の準備ができているキーのセットを選択します。 |
| SelectedKeys() |
このセレクターの選択されたキー セットを返します。 |
| SelectNow() |
対応するチャネルが I/O 操作の準備ができているキーのセットを選択します。 |
| SelectNow(IConsumer) |
対応するチャネルが I/O 操作の準備ができているキーに対してアクションを選択して実行します。 |
| SetHandle(IntPtr, JniHandleOwnership) |
Handle プロパティを設定します。 (継承元 Object) |
| ToArray<T>() |
|
| ToString() |
オブジェクトの文字列形式を返します。 (継承元 Object) |
| UnregisterFromRuntime() |
|
| Wait() |
現在のスレッドが起動するまで待機します。通常は、 <em>notified</em> または <em>interrupted</em>。 (継承元 Object) |
| Wait(Int64, Int32) |
現在のスレッドは、通常、 <em>notified</em> または <em>interrupted</em>、または一定のリアルタイムが経過するまで、起動されるまで待機します。 (継承元 Object) |
| Wait(Int64) |
現在のスレッドは、通常、 <em>notified</em> または <em>interrupted</em>、または一定のリアルタイムが経過するまで、起動されるまで待機します。 (継承元 Object) |
| Wakeup() |
まだ返されていない最初の選択操作をすぐに返します。 |
明示的なインターフェイスの実装
| 名前 | 説明 |
|---|---|
| IJavaPeerable.Disposed() |
|
| IJavaPeerable.DisposeUnlessReferenced() |
|
| IJavaPeerable.Finalized() |
|
| IJavaPeerable.JniManagedPeerState |
|
| IJavaPeerable.SetJniIdentityHashCode(Int32) |
|
| IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
|
| IJavaPeerable.SetPeerReference(JniObjectReference) |
|
拡張メソッド
| 名前 | 説明 |
|---|---|
| GetJniTypeName(IJavaPeerable) |
インスタンス |
| JavaAs<TResult>(IJavaPeerable) |
|
| JavaCast<TResult>(IJavaObject) |
Android ランタイムチェック型変換を実行します。 |
| JavaCast<TResult>(IJavaObject) |
|
| TryJavaCast<TResult>(IJavaPeerable, TResult) |
|