- 直接已知的子类:
-
AbstractSelectionKey
Selector
注册SelectableChannel
的令牌。
每次将通道注册到选择器时都会创建一个选择键。选择键保持有效,直到通过调用其cancel
方法、关闭其通道或关闭其选择器来取消它。取消键不会立即从其选择器中移除;相反,它将被添加到选择器的已取消键集中,以便在下一次选择操作期间移除。可以通过调用其isValid
方法来测试键的有效性。
选择键包含两个表示为整数值的操作集。操作集的每个位表示键的通道支持的可选择操作的类别。
-
兴趣集确定下一次调用选择器的选择方法时将测试哪些操作类别的就绪性。兴趣集在创建键时使用给定值初始化;稍后可以通过
interestOps(int)
方法进行更改。 -
就绪集标识键的通道已被键的选择器检测到就绪的操作类别。就绪集在创建键时初始化为零;它可能在选择操作期间由选择器稍后更新,但不能直接更新。
选择键的就绪集指示其通道准备好执行某些操作类别,这只是一个提示,而不是保证,线程可以在不导致线程阻塞的情况下执行该类别中的操作。就绪集在选择操作完成后立即最有可能是准确的。外部事件和在相应通道上调用的I/O操作可能会使其不准确。
此类定义了所有已知的操作集位,但给定通道支持的确切位取决于通道的类型。每个SelectableChannel
的子类定义了一个validOps()
方法,该方法返回一个标识通道支持的操作的集合。尝试设置或测试键的通道不支持的操作集位将导致适当的运行时异常。
通常需要将一些特定于应用程序的数据与选择键关联,例如表示更高级协议状态并处理就绪通知以实现该协议的对象。因此,选择键支持将单个任意对象附加到键。可以通过attach
方法附加对象,然后稍后通过attachment
方法检索对象。
选择键可供多个并发线程安全使用。选择操作将始终使用在操作开始时的兴趣集值。
- 自:
- 1.4
- 参见:
-
Field Summary
Modifier and TypeFieldDescriptionstatic final int
套接字接受操作的操作集位。static final int
套接字连接操作的操作集位。static final int
读操作的操作集位。static final int
写操作的操作集位。 -
Constructor Summary
-
Method Summary
Modifier and TypeMethodDescriptionfinal Object
将给定对象附加到此键。final Object
检索当前附件。abstract void
cancel()
请求取消此键的通道与其选择器的注册。abstract SelectableChannel
channel()
返回创建此键的通道。abstract int
检索此键的兴趣集。abstract SelectionKey
interestOps
(int ops) 将此键的兴趣集设置为给定值。int
interestOpsAnd
(int ops) 将此键的兴趣集原子设置为现有兴趣集和给定值的按位交集("and")。int
interestOpsOr
(int ops) 将此键的兴趣集原子设置为现有兴趣集和给定值的按位并集("or")。final boolean
测试此键的通道是否准备好接受新的套接字连接。final boolean
测试此键的通道是否已完成或未能完成其套接字连接操作。final boolean
测试此键的通道是否准备好读取。abstract boolean
isValid()
告知此键是否有效。final boolean
测试此键的通道是否准备好写入。abstract int
readyOps()
检索此键的就绪操作集。abstract Selector
selector()
返回创建此键的选择器。
-
Field Details
-
OP_READ
public static final int OP_READ读操作的操作集位。假设选择键的兴趣集在选择操作开始时包含
OP_READ
。如果选择器检测到相应通道准备好读取、已到达流的末尾、已被远程关闭以进行进一步写入或有待处理错误,则它将向键的就绪操作集添加OP_READ
。- 参见:
-
OP_WRITE
public static final int OP_WRITE写操作的操作集位。假设选择键的兴趣集在选择操作开始时包含
OP_WRITE
。如果选择器检测到相应通道准备好写入、已被远程关闭以进行进一步读取或有待处理错误,则它将向键的就绪集添加OP_WRITE
。- 参见:
-
OP_CONNECT
public static final int OP_CONNECT套接字连接操作的操作集位。假设选择键的兴趣集在选择操作开始时包含
OP_CONNECT
。如果选择器检测到相应套接字通道准备完成其连接序列,或有待处理错误,则它将向键的就绪集添加OP_CONNECT
。- 参见:
-
OP_ACCEPT
public static final int OP_ACCEPT套接字接受操作的操作集位。假设选择键的兴趣集在选择操作开始时包含
OP_ACCEPT
。如果选择器检测到相应服务器套接字通道准备接受另一个连接,或有待处理错误,则它将向键的就绪集添加OP_ACCEPT
。- 参见:
-
-
Constructor Details
-
SelectionKey
protected SelectionKey()构造此类的实例。
-
-
Method Details
-
channel
返回创建此键的通道。即使键被取消,此方法仍将继续返回通道。- 返回:
- 此键的通道
-
selector
返回创建此键的选择器。即使键被取消,此方法仍将继续返回选择器。- 返回:
- 此键的选择器
-
isValid
public abstract boolean isValid()告知此键是否有效。键在创建时有效,并保持有效,直到取消、关闭其通道或关闭其选择器。
- 返回:
-
true
,如果且仅如果此键有效
-
cancel
public abstract void cancel()请求取消此键的通道与其选择器的注册。返回后,键将无效,并已添加到其选择器的已取消键集中。键将在下一次选择操作期间从选择器的所有键集中移除。如果此键已被取消,则调用此方法不起作用。一旦取消,键将永远无效。
此方法可以随时调用。它会同步选择器的已取消键集,因此如果与涉及相同选择器的取消或选择操作同时调用,则可能会短暂阻塞。
-
interestOps
public abstract int interestOps()检索此键的兴趣集。保证返回的集合仅包含对此键的通道有效的操作位。
- 返回:
- 此键的兴趣集
- 抛出:
-
CancelledKeyException
- 如果此键已被取消
-
interestOps
将此键的兴趣集设置为给定值。可以随时调用此方法。如果在进行选择操作时调用此方法,则对该操作没有影响;对键的兴趣集的更改将在下一次选择操作中可见。
- 参数:
-
ops
- 新的兴趣集 - 返回:
- 此选择键
- 抛出:
-
IllegalArgumentException
- 如果集合中的位不对应于此键的通道支持的操作,即,如果(ops & ~channel().validOps()) != 0
-
CancelledKeyException
- 如果此键已被取消
-
interestOpsOr
public int interestOpsOr(int ops) 原子地将此键的兴趣集设置为现有兴趣集和给定值的按位并集(“or”)。此方法保证在其他并发调用此方法或interestOpsAnd(int)
时是原子的。此方法可以随时调用。如果在选择操作正在进行时调用此方法,则对该操作没有影响;键的兴趣集的更改将在下一个选择操作中被看到。
- 实现要求:
-
默认实现在此键上同步,并调用
interestOps()
和interestOps(int)
来检索和设置此键的兴趣集。 - 参数:
-
ops
- 要应用的兴趣集 - 返回:
- 先前的兴趣集
- 抛出:
-
IllegalArgumentException
- 如果集合中的位不对应于此键的通道支持的操作,即,如果(ops & ~channel().validOps()) != 0
-
CancelledKeyException
- 如果此键已被取消 - 自:
- 11
-
interestOpsAnd
public int interestOpsAnd(int ops) 原子地将此键的兴趣集设置为现有兴趣集和给定值的按位交集(“and”)。此方法保证在其他并发调用此方法或interestOpsOr(int)
时是原子的。此方法可以随时调用。如果在选择操作正在进行时调用此方法,则对该操作没有影响;键的兴趣集的更改将在下一个选择操作中被看到。
- API 注意:
-
与
interestOps(int)
和interestOpsOr(int)
方法不同,当使用兴趣集中不对应于此键的通道支持的操作的位调用此方法时,此方法不会抛出IllegalArgumentException
。这是为了允许使用按位补码值清除兴趣集中的操作位,例如,interestOpsAnd(~SelectionKey.OP_READ)
将从兴趣集中移除OP_READ
而不影响其他位。 - 实现要求:
-
默认实现在此键上同步,并调用
interestOps()
和interestOps(int)
来检索和设置此键的兴趣集。 - 参数:
-
ops
- 要应用的兴趣集 - 返回:
- 先前的兴趣集
- 抛出:
-
CancelledKeyException
- 如果此键已被取消 - 自:
- 11
-
readyOps
public abstract int readyOps()检索此键的就绪操作集。保证返回的集合只包含对此键的通道有效的操作位。
- 返回:
- 此键的就绪操作集
- 抛出:
-
CancelledKeyException
- 如果此键已被取消
-
isReadable
public final boolean isReadable()测试此键的通道是否准备好进行读取。k.isReadable()
形式调用此方法的行为与表达式完全相同k.readyOps() & OP_READ != 0
如果此键的通道不支持读操作,则此方法始终返回
false
。- 返回:
-
true
当且仅当readyOps() & OP_READ
为非零时 - 抛出:
-
CancelledKeyException
- 如果此键已被取消
-
isWritable
public final boolean isWritable()测试此键的通道是否准备好进行写入。k.isWritable()
形式调用此方法的行为与表达式完全相同k.readyOps() & OP_WRITE != 0
如果此键的通道不支持写操作,则此方法始终返回
false
。- 返回:
-
true
当且仅当readyOps() & OP_WRITE
为非零时 - 抛出:
-
CancelledKeyException
- 如果此键已被取消
-
isConnectable
public final boolean isConnectable()测试此键的通道是否已完成或未能完成其套接字连接操作。k.isConnectable()
形式调用此方法的行为与表达式完全相同k.readyOps() & OP_CONNECT != 0
如果此键的通道不支持套接字连接操作,则此方法始终返回
false
。- 返回:
-
true
当且仅当readyOps() & OP_CONNECT
为非零时 - 抛出:
-
CancelledKeyException
- 如果此键已被取消
-
isAcceptable
public final boolean isAcceptable()测试此键的通道是否准备好接受新的套接字连接。k.isAcceptable()
形式调用此方法的行为与表达式完全相同k.readyOps() & OP_ACCEPT != 0
如果此键的通道不支持套接字接受操作,则此方法始终返回
false
。- 返回:
-
true
当且仅当readyOps() & OP_ACCEPT
为非零时 - 抛出:
-
CancelledKeyException
- 如果此键已被取消
-
attach
将给定对象附加到此键。attachment
方法检索附加的对象。一次只能附加一个对象;调用此方法会导致丢弃任何先前的附件。当前附件可以通过附加null
来丢弃。- 参数:
-
ob
- 要附加的对象;可以是null
- 返回:
-
先前附加的对象,如果有的话,否则为
null
-
attachment
检索当前附件。- 返回:
-
当前附加到此键的对象,如果没有附件则为
null
-