java Nio通道注册源码分析

AbstractSelectableChannel#register(Selector sel, int ops, Object att)

public final SelectionKey register(Selector sel, int ops,
                                       Object att)
        throws ClosedChannelException
    {
        synchronized (regLock) {
        	//如果通道没有开启则抛出异常
            if (!isOpen())
                throw new ClosedChannelException();
            //如果注册的监听事件不是读、写、连接事件则抛出异常
            if ((ops & ~validOps()) != 0)
                throw new IllegalArgumentException();
            //如果是阻塞channel则抛出异常
            if (blocking)
                throw new IllegalBlockingModeException();
            //查找通道的SelectionKey 
            SelectionKey k = findKey(sel);
            if (k != null) {
            	//如果SelectionKey 不为空则注册关心的事件类型
                k.interestOps(ops);
                k.attach(att);
            }
            if (k == null) {
                // New registration
                synchronized (keyLock) {
                    if (!isOpen())
                        throw new ClosedChannelException();
                    //如果SelectionKey 为空则将通道注册到Selector
                    k = ((AbstractSelector)sel).register(this, ops, att);
                    addKey(k);
                }
            }
            return k;
        }
    }

SelectorImpl#register(AbstractSelectableChannel var1, int var2, Object var3):SelectionKey

protected final SelectionKey register(AbstractSelectableChannel var1, int var2, Object var3) {
        if (!(var1 instanceof SelChImpl)) {
            throw new IllegalSelectorException();
        } else {
        	//根据channel和selector创建一个SelectionKeyImpl 对象
            SelectionKeyImpl var4 = new SelectionKeyImpl((SelChImpl)var1, this);
            //向SelectionKeyImpl中设置附件内容
            var4.attach(var3);
            Set var5 = this.publicKeys;
            synchronized(this.publicKeys) {
            	//将SelectionKeyImpl 注册到selector中去
                this.implRegister(var4);
            }
			//设置感兴趣事件类型
            var4.interestOps(var2);
            return var4;
        }
    }

WindowsSelectorImpl#implRegister(SelectionKeyImpl var1) 将selectionKey注册到操作系统的Selector系统调用上

protected void implRegister(SelectionKeyImpl var1) {
        Object var2 = this.closeLock;
        synchronized(this.closeLock) {
            if (this.pollWrapper == null) {
                throw new ClosedSelectorException();
            } else {
            	//如果存储selectionKey的数组容量不够则扩容
                this.growIfNeeded();
                //将selectionKey存入数值
                this.channelArray[this.totalChannels] = var1;
                var1.setIndex(this.totalChannels);
                this.fdMap.put(var1);
               	//将key添加到数组
                this.keys.add(var1);
                //将通道的文件描述符存储到pollWrapper中
                this.pollWrapper.addEntry(this.totalChannels, var1);
                ++this.totalChannels;
            }
        }
    }

channel注册涉及的UML图:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
zbus核心是一个独立实现的小巧极速的消息队列(MQ),支持持久化与内存队列, 支持单播、广播、组播等多种消息通信模式;在MQ之上zbus完备地支持了RPC服务,RPC支持独立伺服,基于总线两种模式;同时zbus支持代理服务,基于MQ的HttpProxy实现了类Nginx的HTTP代理服务(支持DMZ网络结构),TcpProxy则支持透明的TCP协议代理,可以代理任何基于TCP的协议,比如代理MySQL数据库。 zbus内建分布式高可用(HA),解决单点问题;Java/.NET/JS/C++/PHP等主流语言接入能力为zbus充当SOA服务总线提供跨平台支持; 在设计上,zbus拥抱KISS准则,所有特性浓缩在一个小小的400K左右的jar包(非常少的依赖);轻量,MQ核心,方便二次开发,zbus为微服务架构、系统整合、弹性计算、消息推送等场景提供开箱即用的功能支持。 ZBUS主要特性: 1、高速磁盘/内存MQ,支持单播,广播,组播,订阅多种消息模式 2、RPC开箱即用,支持同步异步,动态类代理 3、多语言客户端,Java/.NET/JavaScript/PHP/Python/C++/Go(服务器) 4、轻量级,发行大小 ~3M, 核心 ~400K, 极少依赖 5、高可用无应用故障单点,分布式高可用的内置支持 6、简洁的协议设计,类HTTP头部扩展协议,长短连接,WebSocket支持 7、内置监控,不断丰富的监控指标 ZBUS以轻量弹性著称,目前已知的应用主要分布在证券金融行业,在各大券商内部使用,因为开源同时也有不少二次开发定制的项目存在。 ZBUS可以有多种工作角色: 1、MQ服务器 2、RPC服务器 3、Proxy HTTP/TCP代理 4、服务标准化总线服务器
Java NIO(New IO)是Java 1.4版本提供的一种新的IO API,它提供了与传统IO API不同的IO处理方式,包括了通道(channel)和缓冲区(buffer)的概念。Java NIO的目标是提供比传统IO更快、更高效的IO操作方式。 Java NIO源码解析需要深入了解Java NIO的核心概念,主要包括以下几个部分: 1. 缓冲区(Buffer):Java NIO的缓冲区是一个对象,它包含了一定数量的数据元素,并且提供了对这些数据元素的基本操作方法。Java NIO的所有数据都是通过缓冲区来传输的。 2. 通道(Channel):Java NIO通道是一种对象,它可以用来读取和写入数据。通道类似于流,但是它们可以被双向读写,并且可以同时处理多个线程。 3. 选择器(Selector):Java NIO的选择器是一种对象,它可以用来监视多个通道的事件(如读写就绪),从而实现单线程处理多个通道的能力。 4. 文件处理:Java NIO提供了一组文件处理的API,包括了文件读写、文件锁、文件映射等功能。 Java NIO源码解析需要深入研究Java NIO的实现细节,包括了缓冲区的实现、通道的实现、选择器的实现等。其,缓冲区的实现是Java NIO的核心,也是最复杂的部分。Java NIO的缓冲区是通过JNI(Java Native Interface)和Java堆内存来实现的,它提供了高效的数据传输方式,但是也带来了一些复杂性。通道的实现是基于底层的操作系统文件描述符来实现的,它提供了高效的IO操作方式,但是也需要考虑系统平台的差异性。选择器的实现是基于操作系统提供的事件驱动机制来实现的,它可以实现单线程同时处理多个通道的能力,但是也需要考虑系统平台的差异性。 总之,Java NIO源码解析需要深入理解Java NIO的核心概念和实现细节,这样才能更好地理解Java NIO的工作机制,并且能够在实际开发灵活运用Java NIO的各种功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值