Tomcat源码番外篇:Selector 、SelectionKey、NIO补充

版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在页面明显位置给出原文链接。 https://blog.csdn.net/mengxiangqihangz/article/details/88541713

本篇笔记的目的是:补充Selector基础不够牢固的问题
Selector 选择器 分析

Selector

  • 键集
  1. 键集
  2. 已选择键集
  3. 已取消键集
    通过关闭某个键的通道或者是调用该键的 cancel 方法来取消键,取消的键将被添加到已取消键集中。已取消键集中的键,在下一次“选择”(select())操作期间将注销该键的通道,而在注销时该键将从所有选择器的键集(键集、已选择键集、已取消键集)中移除该键。
   protected HashSet keys;//“键集” 与选择器关联的key集合  
   protected Set selectedKeys;//“已选择键集”就绪key集合,即已经操作事件准备就绪的选择key  
   private Set publicKeys;//外部访问key集合的代理  
   private Set publicSelectedKeys;//外部访问就绪key集合代理 
   private Set<SelectionKey> cancelledKeys ;已取消键集
  • SelectorImpl类中的select()
    在这里插入图片描述
    lockAndDoSelect 方法 调用的是 WindowsSelectorImpl 的 doSelect(),这里不做深究。处理流程在
    开头引入的笔记中有讲
    在这里插入图片描述

register注册流程(本篇重点)

  • SelectionKey类中包含了什么
    在这里插入图片描述
    在这里插入图片描述
    ==》 SelectionKey 中包含 socketchannel、attachment和interestOps 信息
  • Selector的实现类SelectorImpl 的register()
    在这里插入图片描述
    第一个方框 创建SelectionKey对象
    第二个方法 将SelectionKey对象 注册到Selector中,即保存到keys中(一个Set 集合)
  • 结:
    得到SelectionKey,就可以得到其中包含的SocketChannel 和attachment
    attachment 其实是为了方便开发者扩展的。
    Tomcat源码中的KeyAttachment 就是其扩展之一,目的是为SelectionKey绑定 更多的信息

猜你喜欢

转载自blog.csdn.net/mengxiangqihangz/article/details/88541713