文章目录
总结
- SelectionKey虚拟类表示通道SelectableChannel与选择器Selector注册的标记
- 每次向选择器注册通道时,都会创建一个选择键SelectionKey,在通过调用其cancel方法取消键、 关闭其通道或关闭其选择器之前,键一直有效。cancel方法取消键不会立即将其从选择器中移除,而是将其添加到选择器的取消键集合中, 以便在下一次选择操作中删除,可以通过调用其isValid方法来测试密钥SelectionKey的有效性
- SelectionKey包含两个表示为整数值的操作集,一个是兴趣集,一个是就绪操作集,兴趣集表示SelectionKey对对应通道的某类操作感兴趣,当选择器Selector监听到该通道已经准备好该操作时候,会将该操作放入就绪操作集,其实就是将表示就绪操作集的整数的某些位设置为1,而一开始设置兴趣集的时候也是将表示兴趣集的整数的某些位设置为1
- 选择键的就绪集表示其通道已为某个操作类别做好准备,这是一种提示,但不能保证线程可以执行此类类别中的操作,而不会导致线程阻塞。就绪集最有可能在选择操作select()完成后立即准确, 外部事件和在相应通道上调用的I/O操作可能会使其不准确,因为当调用I/O操作后会把就绪集的对应位设为置为0,但可能在置为0后,该通道又准备好了该操作,只有等待下一次select()重新将就绪操作集设置为准确状态
- 此类定义了所有已知的操作集位,但给定通道支持哪些位取决于通道的类型 SelectableChannel的每个子类定义一个 SelectableChannel#validOps()方法,该方法返回一个集合,该集合仅标识通道支持的那些操作,尝试设置或获取密钥通道不支持的操作集位将导致相应的运行时异常
- 通常需要将某些特定于应用程序的数据与选择键SelectionKey相关联,例如,表示高级协议状态并处理就绪通知的对象(存储的数据的缓冲区并且有状态的对象,如进行到协议哪一步),以便实现该协议。 因此,选择键支持将单个任意对象附着到键。对象可以通过attach方法附加,然后通过attachment()方法检索
- 多个并发线程可以安全地使用选择键SelectionKey,选择器的选择操作select()将始终使用操作开始时的当前兴趣集值
SelectionKey虚拟类方法
选择器、通道、键操作
方法名 | 作用 |
---|
abstract SelectableChannel channel() | 返回此密钥SelectionKey对应的通道,即使在取消密钥后,此方法仍将继续返回通道 |
abstract Selector selector() | 返回此键SelectionKey对应的选择器,即使在取消键SelectionKey后,此方法仍将继续返回选择器 |
abstract boolean isValid() | 判断此密钥SelectionKey是否有效 |
abstract void cancel() | 请求取消此密钥SelectionKey的对应的通道Channel在其选择器Selector上的注册,返回时,钥匙将无效,并已添加到选择器的取消钥匙集中,在下一次选择操作中,该键将从选择器的所有键集中删除 |
获取和设置兴趣集
方法名 | 作用 |
---|
abstract int interestOps() | 检索此键的兴趣集 |
abstract SelectionKey interestOps(int ops) | 将此键的兴趣集设置为给定值 |
int interestOpsOr(int ops) | 原子地将该键的兴趣集设置为现有兴趣集和给定值的位并集(“or”), 对于对该方法或interestOpsAnd(int)的其他并发调用,该方法保证是原子的 |
int interestOpsAnd(int ops) | 以原子方式将此键的兴趣集设置为现有兴趣集与给定值的按位交集(“and”),对于对该方法或interestOpsOr(int)的其他并发调用,该方法保证是原子的 |
检测就绪操作
方法名 | 作用 |
---|
abstract int readyOps() | 检索此密钥的就绪操作集 |
final boolean isReadable() | 判断此键的通道是否已准备好读取 |
final boolean isWritable() | 判断此密钥的通道是否已准备好写入 |
final boolean isConnectable() | 判断此密钥的通道是否已完成或未能完成其套接字连接操作 |
final boolean isAcceptable() | 判断此密钥的通道是否准备好接受新的套接字连接 |
添加和获取附件
方法名 | 作用 |
---|
final Object attach(Object ob) | 将给定对象作为附件附加到此键上 |
final Object attachment() | 获取当前附件 |
兴趣集(操作集)
兴趣名 | 意义 |
---|
OP_READ | 表示该SelectionKey对通道上的读取事件感兴趣,当选择器监测到相应的通道已准备好读取(将通道字节序列读入到缓冲区)或出现错误,则它将向密钥的就绪操作集添加OP_READ,只是将int整数的特定位( 1 << 0)置为1 |
OP_WRITE | 表示该SelectionKey对通道上的写入事件感兴趣,当选择器监测到相应的通道已准备好写入(将缓冲区的字节序列写入通道)或出现错误,则它将向密钥的就绪操作集添加OP_READ,只是将int整数的特定位( 1 << 0)置为1 |
OP_CONNECT | 表示该SelectionKey对通道上的读取事件感兴趣,当选择器监测到相应的通道已准备好完成连接(取出相应SocketChannel通道,使用finishConnect等待连接完成,然后进行传输数据操作)或出现错误,则它将向密钥的就绪操作集添加OP_READ,只是将int整数的特定位( 1 << 0)置为1 |
OP_ACCEPT | 表示该SelectionKey对通道上的读取事件感兴趣,当选择器监测到相应的通道已准备好接受连接(取出服务端通道 ServerSocketChannel 创建用于传输数据的SocketChannel 通道)或出现错误,则它将向密钥的就绪操作集添加OP_READ,只是将int整数的特定位( 1 << 0)置为1 |
标签:Java,int,虚拟,密钥,操作,SelectionKey,选择器,通道
来源: https://blog.csdn.net/weixin_45754452/article/details/122027999