Tomcat源码番外篇:Selector 、SelectionK
2019-12-16 本文已影响0人
sunpengshujun
@[toc]
本篇笔记的目的是:补充Selector基础不够牢固的问题
Selector 选择器 分析
Selector
- 键集
- 键集
- 已选择键集
-
已取消键集
通过关闭某个键的通道或者是调用该键的 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> 集合) - 结:
得到SelectionKey,就可以得到其中包含的SocketChannel 和attachment
attachment 其实是为了方便开发者扩展的。
Tomcat源码中的KeyAttachment 就是其扩展之一,目的是为SelectionKey绑定 更多的信息