NIO 向Selector注册Channel

在这里插入图片描述
执行ServerSocketChannelImpl.register(),入参为selector(这里是WindowsSelectorImpl)和selector需要关注的事件,这里是SelectionKey.OP_ACCEPT,其实就是一个数字
在这里插入图片描述

在这里插入图片描述
先执行SelectableChannel的register
在这里插入图片描述
再执行AbstractSelectableChannel的register

AbstractSelectableChannel # register()

在这里插入图片描述
这里有四步是关键,第1步获取key,2、 3 是 key不为null时的处理逻辑,4是key 为null时的处理逻辑

向Selector注册Channel,我们可以把Selector理解为一个快递分发中心,而所有的Channel都可以理解为快递小哥,首先所有的快递小哥要在分发中心注册,注册之后返回一个唯一的key作为身份标识,之后当属于该快递小哥运送区域的快递到来时Selector就会去通知该快递小哥。(这样就可以理解key为null代表该Channel还没有注册到Selector,需要执行第4步进行注册)

在这里插入图片描述

(1)key为null时

4. k = ((AbstractSelector)sel).register(this, ops, att);注册key

先来看入参:
在这里插入图片描述

  1. selector对象
  2. 操作 operation,是一个int值
  3. 一个对象,这个对象是做什么的?(下文解释)

在这里插入图片描述

这时候就需要SelectionKeyImpl组件的参与
分为四步:

  1. 创建一个SelectionKeyImpl
  2. 执行attach操作
  3. 执行注册implRegister
  4. 执行SelectionKeyImpl.interestOps
    在这里插入图片描述
    先创建一个SelectionKeyImpl,然后执行attach操作
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

这里用到了原子更新引用类AtomicReferenceFieldUpdater,它的目的是原子更新对象中的一个volatile字段,也就是这里的attachme对象,以这里为例首先通过newUpdater创建一个该对象,入参分别是attachment所在类、attachment类型以及该字段名称,然后通过调用该对象的getAndSet方法原子更新attachment的值,这里的新value是null,所以最终实现的效果是原子更新对象SelectionImpl的volatile字段 attachment的值为null。
在这里插入图片描述
执行完attach操作,就该
WindowsSelectorImpl#implRegister

绑定感兴趣的事件,这个也是NIO重要的点之一。
在这里插入图片描述
SelectionKeysImpl具有属性,此时设置该属性。
在这里插入图片描述
最后一步,addKey(k); 没啥操作,就是在Channel这边创建一个数据结构存放注册给Selector返回的SelectionKeyImpl。
在这里插入图片描述
在这里插入图片描述

(2) key不为null时

1. SelectionKey k = findKey(sel);

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值