`
bzhjian
  • 浏览: 6707 次
  • 性别: Icon_minigender_1
  • 来自: 桂林
社区版块
存档分类
最新评论

Netty4源码分析—NioEventLoopGroup, NioEventLoop生成Selector

阅读更多

    真正实现生成selector的方法是在的NioEventLoopGroup的父类MultithreadEventExecutorGroupMultithreadEventExecutorGroup(int nThreads, ThreadFactory threadFactory, Object... args)方法

 

参数:1nThreads为线程数量,也就是nioselector的数量,默认为CPU核数*2

    (DEFAULT_EVENT_LOOP_THREADS = Math.max(1, SystemPropertyUtil.getInt( "io.netty.eventLoopThreads", Runtime.getRuntime().availableProcessors() * 2))

 

    2ThreadFactory 线程工厂

 

    3args参数,这里的参数主要的是用于生成java nioSeletor的对象,这个参数我们没有传进去,Netty会自动判断并使用java.nio.channels.spi.SelectorProvider对象;

 

 

   MultithreadEventExecutorGroup方法中主要的源码:

 

if (nThreads <= 0) {
            throw new IllegalArgumentException(String.format("nThreads: %d (expected: > 0)", nThreads));
        }
        if (threadFactory == null) {
            threadFactory = newDefaultThreadFactory();
        }
        children = new SingleThreadEventExecutor[nThreads];
        for (int i = 0; i < nThreads; i ++) {
            boolean success = false;
            try {
                children[i] = newChild(threadFactory, args);
                success = true;
            } catch (Exception e) {
                // TODO: Think about if this is a good exception type
                throw new IllegalStateException("failed to create a child event loop", e);
            } 

   这段代码中最主要的是newChild(threadFactory, args)这句话主要是生成了NioEventLoop对象,NioEventLoop对象调用openSelector方法生成了nio的选择器selector

private Selector openSelector() {
        final Selector selector;
        try {
            selector = provider.openSelector();
        } catch (IOException e) {
            throw new ChannelException("failed to open a new selector", e);
        }
        if (DISABLE_KEYSET_OPTIMIZATION) {
            return selector;
        }
        try {
            SelectedSelectionKeySet selectedKeySet = new SelectedSelectionKeySet();
            Class<?> selectorImplClass =
                    Class.forName("sun.nio.ch.SelectorImpl", false, ClassLoader.getSystemClassLoader());
            // Ensure the current selector implementation is what we can instrument.
            if (!selectorImplClass.isAssignableFrom(selector.getClass())) {
                return selector;
            }
            Field selectedKeysField = selectorImplClass.getDeclaredField("selectedKeys");
            Field publicSelectedKeysField = selectorImplClass.getDeclaredField("publicSelectedKeys");
            selectedKeysField.setAccessible(true);
            publicSelectedKeysField.setAccessible(true);
            selectedKeysField.set(selector, selectedKeySet);
            publicSelectedKeysField.set(selector, selectedKeySet);
            selectedKeys = selectedKeySet;
            logger.trace("Instrumented an optimized java.util.Set into: {}", selector);
        } catch (Throwable t) {
            selectedKeys = null;
            logger.trace("Failed to instrument an optimized java.util.Set into: {}", selector, t);
        }

        return selector;
}

 

    其中selector = provider.openSelector()负责生成seletor,这个方法后面的操作主要是通过反射优化Set类型的selectedKeys, publicSelectedKeys,因为在selector中这两个都不是线程安全的(没看selector源码,猜测而以),Netty自己使用实现Set接口SelectedSelectionKeySet代替原来的Set实现,防止在selectedKeyspublicSelectedKeys在读写时出现java.util.ConcurrentModificationException的异常.


最后在绑定端口时,由ServerBootstrap的父类AbstractBootstrapinitAndRegiste方法调用NioEventLoopGroupregister方法将serversocketchannel注册到selector中并开始监听.

 

 

分享到:
评论

相关推荐

    netty源码分析教程视频

    一个netty的入门教程以及源码分析视频,适合刚学习的人

    netty源码深入分析

    《Netty源码深入分析》是由美团基础架构部的闪电侠老师所分享的一系列关于Netty源码解析的视频教程。以下将根据标题、描述、标签以及部分内容等信息,对Netty及其源码进行深入剖析。 ### Netty简介 Netty是基于...

    Netty4.x源码分析详解

    在深入分析 Netty 4.x 源码之前,我们首先需要了解其核心概念和架构。 Netty 的核心组件包括: 1. **ByteBuf**: 作为传统 ByteBuffer 的替代品,ByteBuf 提供了更高效且易用的内存管理机制,支持读写分离,避免了...

    netty4源码

    netty4所有的jar包和源码,资源丰富,值得下载。

    Netty 4.1源码包

    Netty4.1的源码,欢迎大家下载。.............................................................................................................................................................................

    netty4 sources 源码

    这个“netty4 sources 源码”指的是Netty 4.x 版本的源代码,其中4.0.33.Final是特定的版本号。源码分析对于理解Netty的工作原理、优化性能以及定制化开发非常有帮助。 Netty 的核心特性包括: 1. **异步事件驱动*...

    netty4.0源码,netty例子,netty api文档

    4. **Pipeline**:Netty的ChannelHandler链是通过Pipeline实现的。Pipeline允许你自定义处理网络数据的方式,每个Handler可以执行特定的任务,如解码、加密、认证等。数据在网络中的流动就像在Pipeline中的传输一样...

    以netty4.1源码中的EchoServer为例对netty的源码进行分析.docx

    在本文中,我们将深入分析 Netty 4.1 源码中的 EchoServer 示例,以理解其核心组件和工作原理。 首先,我们关注 EchoServer 服务端的初始化,这涉及到两个关键组件:`bossGroup` 和 `workerGroup`。它们都是 `...

    netty源码 4.*版本

    Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在深入探讨 Netty 源码之前...通过分析源码,不仅可以提升自己的技术能力,还能为解决实际问题提供灵感和参考。

    netty源码剖析视频.zip

    《Netty源码剖析视频》课程是一份深度探讨Netty框架源码及其实战应用的资源集合。课程分为两个主要部分,旨在帮助开发者深入理解Netty的内部机制,并通过实战项目提升其在实际开发中的应用能力。 第一部分,深入浅...

    Netty源码分析总结.rar

    Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的...在分析源码的过程中,我们通常会关注类的设计模式、线程模型、内存管理以及性能优化等方面,这对于提升网络编程和系统架构能力大有裨益。

    Netty架构源码剖析_netty_

    深入源码分析,我们可以看到Netty如何优雅地处理了线程安全、内存池管理、心跳机制、解码编码、零拷贝等高级特性。例如,Netty通过内部的DirectBufferPool和HeapBufferPool实现了内存池,减少了内存分配和释放的开销...

    Netty4&5源码编译所需jar包

    在深入研究Netty4和Netty5的源码时,开发者可能会遇到因缺少依赖jar包而导致的编译错误。这些必要的jar包是确保Netty项目正常运行的关键组成部分。 首先,我们来看一下提供的jar包列表及其对应的功能: 1. **bar...

    Netty4源码深入剖析(高清视频教程) .rar

    这个“Netty4源码深入剖析”高清视频教程,显然是针对那些希望深入理解Netty工作原理和源码实现的学习者设计的。在深入探讨之前,让我们先了解一下Netty的一些基本概念和特性。 Netty 的核心在于其NIO(非阻塞I/O)...

    netty_learn_netty_源码.zip

    通过阅读和分析这个“netty_learn_netty_源码.zip”中的源代码,你可以深入了解Netty如何实现这些功能,以及它是如何优化网络通信效率的。此外,你还可以学习到Netty如何处理异常、优雅地关闭连接、线程安全等问题,...

    netty4.1源码

    在 Netty 中,所有的 I/O 操作都在单独的工作线程中进行,这些线程由 NIOEventLoop(或 EpollEventLoop,在 Linux 系统中)管理。这种设计极大地提高了系统的并发能力,减少了上下文切换的开销。 1. **ByteBuf**: ...

    netty整理的源码

    例如,`barchart-netty4-master.zip`可能是一个使用Netty实现的TCP服务端项目,它可能包含用于处理特定业务逻辑的ChannelHandler和自定义的ByteToMessageDecoder与MessageToByteEncoder。 UDP(用户数据报协议)则...

Global site tag (gtag.js) - Google Analytics