Channel(二):可被多路复用的的能力

NIO的Channel可被多路复用的能力

Selector根据Channel的状态来分配任务,所以Channel使用register(Selector,int,Object)方法将自己和相应的状态注册到Selector中。register方法会返回一个SelectionKey来代表这Channel在Selector上的状态。事实上最终是将SelectionKey注册到Selector上

1、注册使用Channel的register(Selector,int,Object),并返回注册成功的SelectionKey。

1)、首先对Channel的状态和注册的参数进行验证(是否是阻塞模式)。

2)、查看Channel的keys中是否Channel注册过这Selector。如果已经注册过则更新SelectionKey的状态。如果没有则使用Selector.register(Channel,int,Object)方法,先生成新的SelectionKey,然后将已经取消注册的cancelledKeys从Selector的keys中移除,最后将SelectionKey添加到Selector和Channel中,并返回。

2、取消注册可以使用Channel.close()或者Selector.cancel(SelectionKey k)或SelectionKey.cancel()。

1)、Channel.close()会对Channel注册的所有SelectionKey取消注册(Channel中keys的作用)。调用:SelectionKey.cancel()->Selector.cancel(SelectionKey k)

2)、SelectionKey.cancel()事实上调用的是Selector.cancel(SelectionKey k)。

3)、Selector.cancel(SelectionKey k)将取消的SelectionKey 添加到cancelledKeys中。

抽象类AbstractSelectableChannel

public abstract class AbstractSelectableChannel
    extends SelectableChannel
{
   

方法

1、注册使用register方法

public final SelectionKey register(Selector sel, int ops,
                                       Object att)
        throws ClosedChannelException
    {
   
        synchronized (regLock) {
   
            if (!isOpen())//1、判断Channel是否开启
                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值