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
多路复用器。
可以通过调用 #open open
此类的方法来创建选择器,该方法将使用系统的默认值 java.nio.channels.spi.SelectorProvider selector provider
创建新的选择器。 还可以通过调用 java.nio.channels.spi.SelectorProvider#openSelector openSelector
自定义选择器提供程序的方法来创建选择器。 选择器保持打开状态,直到它通过其 #close close
方法关闭。
“ks”>
使用选择器注册的可选择通道由对象 SelectionKey
表示。 选择器维护三组选择键:
<ul>
<李>
密钥 集 包含表示此选择器的当前通道注册的密钥。 此方法返回 #keys() keys
此集。
</李>
<李>
所选键集是一组键,以便检测到每个密钥的通道已准备好在之前选择操作期间在密钥的兴趣集中识别的至少一个操作,该操作在集中添加密钥或更新密钥。 此方法返回 #selectedKeys() selectedKeys
此集。 所选键集始终是密钥集的子集。
</李>
<李>
已取消的密钥集是已取消但尚未取消其通道的密钥集。 无法直接访问此集。 已取消的密钥集始终是密钥集的子集。
</李>
</ul>
这三个集在新创建的选择器中都是空的。
将密钥添加到选择器的密钥集中,作为通过通道方法注册通道的 SelectableChannel#register(Selector,int) register
副作用。 在选择操作期间,将从密钥集中删除已取消的密钥。 密钥集本身不可直接修改。
在取消键时,密钥将添加到其选择器的已取消键集中,无论是关闭通道还是调用其 SelectionKey#cancel cancel
方法。 取消密钥将导致在下一个选择操作期间取消注册其通道,此时将从所有选择器的密钥集中删除该密钥。
“sks”>
通过选择操作将键添加到所选键集。 通过调用集的方法或调用java.util.Iterator#remove() remove
从集中java.util.Set#remove(java.lang.Object) remove
获取的方法java.util.Iterator iterator
,可以直接从所选键集中删除密钥。 通过调用集 java.util.Set#clear() clear
的方法,可以从所选键集中删除所有键。 无法将密钥直接添加到所选密钥集中。
“selop”><h2>Selection</h2>
选择操作会查询基础操作系统以获取更新,以便每个已注册通道的准备情况,以执行其密钥兴趣集标识的任何操作。 有两种形式的选择操作:
<老>
<李>
和#select()
#select(long)
#selectNow()
方法将通道的键添加到所选键集,或更新所选密钥集中已有的键的就绪操作集。
</李>
<李>
#select(Consumer, long)
和#select(Consumer)
#selectNow(Consumer)
方法对准备好执行操作的每个通道的键执行操作。 这些方法不会添加到所选键集。
</李>
</老>
<添加到所选键集</h3 的 h3>选择操作>
在每个选择操作期间,可以向选择器的选定键集添加和删除键,并且可以从其密钥和取消键集中删除密钥。 选择由 #select()
#selectNow()
方法执行,涉及三个步骤:
<老>
<李>
取消密钥集中的每个密钥都将从其成员所在的每个密钥集中删除,并且取消注册其通道。 此步骤将取消的键集留空。
</李>
<李>
根据每个剩余通道的准备情况,查询基础操作系统,以执行其关键兴趣集确定的任何操作,从选择操作开始的那一刻开始。 对于准备好执行至少一个此类操作的通道,将执行以下两个操作之一:
<老>
<李>
如果通道的密钥尚未在所选键集中,则会将其添加到该集,并修改其就绪操作集,以准确识别通道现在报告为就绪的操作。 放弃以前在就绪集中记录的任何就绪情况信息。
</李>
<李>
否则,通道的密钥已在所选键集中,因此修改其就绪操作集,以标识报告通道已准备好的任何新操作。 保留以前在就绪集中记录的任何就绪情况信息;换句话说,基础系统返回的就绪集与键的当前就绪集不相交。
</李>
</老>
如果此步骤开始时密钥集中的所有密钥都具有空的兴趣集,则不会更新所选密钥集和任何密钥的就绪操作集。
<李>
如果在步骤(2)正在进行时将任何密钥添加到已取消的密钥集中,则会按步骤 (1) 进行处理。
</李>
</老>
选择操作是否阻止等待一个或多个通道准备就绪,如果是,则三种选择方法之间唯一的基本区别。
<对所选键</h3 执行操作的 h3>选择操作>
在每次选择操作期间,都可以从选择器的键、所选键和已取消的键集中删除键。 选择由 #select(Consumer)
#selectNow(Consumer)
方法执行,涉及三个步骤:
<老>
<李>
取消密钥集中的每个密钥都将从其成员所在的每个密钥集中删除,并且取消注册其通道。 此步骤将取消的键集留空。
</李>
<李>
根据每个剩余通道的准备情况,查询基础操作系统,以执行其关键兴趣集确定的任何操作,从选择操作开始的那一刻开始。
对于已准备好执行至少一个此类操作的通道,通道密钥的就绪操作集设置为准确标识通道准备就绪的操作,并调用为该方法指定的select
操作以使用通道的密钥。 在调用 操作之前,将丢弃以前在就绪集中记录的任何就绪信息。
或者,如果通道已准备好执行多个操作,可以使用通道的键和就绪操作集多次调用该操作,并将该操作设置为通道已准备就绪的操作的子集。 如果对同一键多次调用该操作,则其就绪操作集永远不会包含在同一选择操作中之前对操作的调用集中包含的操作位。
</李>
<李>
如果在步骤(2)正在进行时将任何密钥添加到已取消的密钥集中,则会按步骤 (1) 进行处理。
</李>
</老>
<h2>并发</h2>
选择器及其密钥集可以安全地供多个并发线程使用。 但是,其所选密钥集和已取消的密钥集不是。
选择操作按该顺序在选择器本身、所选键集上同步。 他们还在上述步骤(1)和(3)期间同步取消的密钥集。
在选择操作正在进行时,对选择器键的兴趣集所做的更改对该操作没有影响;下一个选择操作将看到它们。
可能会取消密钥,并且可以随时关闭通道。 因此,在一个或多个选择器的键集中存在键并不意味着密钥有效或其通道处于打开状态。 如果有可能另一个线程取消键或关闭通道,应小心同步和检查这些条件。
选择操作中被阻止的线程可以通过以下三种方式之一被其他线程中断:
<ul>
<李>
通过调用选择器 #wakeup wakeup
的方法,
</李>
<李>
通过调用选择器 #close close
的方法,或
</李>
<李>
通过调用被阻止线程 java.lang.Thread#interrupt() interrupt
的方法,在这种情况下,将设置其中断状态,并调用选择器 #wakeup wakeup
的方法。
</李>
</ul>
该方法 #close close
在选择器上同步,其所选键集的顺序与在选择操作中的顺序相同。
“ksc”>
选择器的密钥集可以安全地供多个并发线程使用。 密钥集中的检索操作通常不会阻止,因此可能与添加到集中的新注册重叠,或者与从集中删除密钥的选择操作取消步骤重叠。 迭代器和拆分器返回一些时间点或创建迭代器/拆分器后反映集状态的元素。 他们不扔 java.util.ConcurrentModificationException ConcurrentModificationException
。
“sksc”>
选择器的选定键集通常不能安全用于多个并发线程。 如果此类线程可以直接修改集,则应通过同步集本身来控制访问。 集 java.util.Set#iterator() iterator
方法返回的迭代器是 失败的: 如果在创建迭代器后修改了集,则调用迭代器自己的 java.util.Iterator#remove() remove
方法除外,否则将引发一个 java.util.ConcurrentModificationException
。
在 1.4 中添加。
适用于 . 的 java.nio.channels.Selector
Java 文档
本页的某些部分是根据 Android 开放源代码项目创建和共享的工作进行的修改,并根据 Creative Commons 2.5 属性许可证中所述的术语使用。
构造函数
Selector() |
初始化此类的新实例。 |
Selector(IntPtr, JniHandleOwnership) |
创建 JNI 对象的托管表示形式时使用的构造函数;由运行时调用。 |
属性
Class |
返回此 |
Handle |
基础 Android 实例的句柄。 (继承自 Object) |
IsOpen |
指示此选择器是否处于打开状态。 |
JniIdentityHashCode |
对象的 |
JniPeerMembers |
对象的 |
PeerReference |
对象的 |
ThresholdClass |
此 API 支持 Mono for Android 基础结构,不打算直接从代码使用。 |
ThresholdType |
此 API 支持 Mono for Android 基础结构,不打算直接从代码使用。 |
方法
Clone() |
创建并返回此对象的副本。 (继承自 Object) |
Close() |
关闭此选择器。 |
Dispose() |
对象的 |
Dispose(Boolean) |
对象的 |
Equals(Object) |
指示其他对象是否“等于”此对象。 (继承自 Object) |
GetHashCode() |
返回对象的哈希代码值。 (继承自 Object) |
JavaFinalize() |
当垃圾回收确定不再引用该对象时,由对象上的垃圾回收器调用。 (继承自 Object) |
Keys() |
返回此选择器的键集。 |
Notify() |
唤醒正在等待此对象的监视器的单个线程。 (继承自 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 通知/em> 或 <em>interrupted</em>。<>< (继承自 Object) |
Wait(Int64, Int32) |
使当前线程等待直到唤醒,通常是通过 <em>通知</em> 或 <em interrupted</em>>,或直到经过一定数量的实时。 (继承自 Object) |
Wait(Int64) |
使当前线程等待直到唤醒,通常是通过 <em>通知</em> 或 <em interrupted</em>>,或直到经过一定数量的实时。 (继承自 Object) |
Wakeup() |
导致尚未返回的第一个选择操作立即返回。 |
显式接口实现
IJavaPeerable.Disposed() |
对象的 |
IJavaPeerable.DisposeUnlessReferenced() |
对象的 |
IJavaPeerable.Finalized() |
对象的 |
IJavaPeerable.JniManagedPeerState |
对象的 |
IJavaPeerable.SetJniIdentityHashCode(Int32) |
对象的 |
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
对象的 |
IJavaPeerable.SetPeerReference(JniObjectReference) |
对象的 |
扩展方法
JavaCast<TResult>(IJavaObject) |
执行 Android 运行时检查的类型转换。 |
JavaCast<TResult>(IJavaObject) |
对象的 |
GetJniTypeName(IJavaPeerable) |
对象的 |