第二节 netty源码分析之NioEventLoopGroup的构造函数分析

告别VSCode配置烦恼:在macOS上快速上手Segger Embedded Studio玩转HPM6750 RISC-V开发 本文详细介绍了如何在macOS上使用Segger Embedded Studio(SES)高效开发HPM6750 RISC-V芯片。从环境配置、许可证激活到项目创建与调试,SES提供了开箱即用的支持,显著提升开发效率。特别适合厌倦VSCode繁琐配置的开发者,体验专业IDE的零配置开发和硬件级调试优势。 阅读详情

一、概述

上一节中,讲了netty的基本应用。这一节主要是根据上一节的应用代码一行行的进行netty的源码分析。上一节的应用代码的main函数里面的第一行是new NioEventLoopGroup(1),下面就分析一下NioEventLoopGroup 的构造方法。

二、NioEventLoopGroup

从类的名字翻译出来 Nio事件轮训组。讲道理的话,它跟线程组是一个意思,都是有一组线程在做同样的申请,就是轮训Channel的IO事件。

先看NioEventLoopGroup 的构造方法。

public NioEventLoopGroup(int nThreads) {
    this(nThreads, (Executor) null);
}

继续找构造方法会找到父类 MultithreadEventLoopGroup的构造方法。

protected MultithreadEventLoopGroup(int nThreads, ThreadFactory threadFactory, Object... args) {
    //nThreads 不传就是0 如果是0的话,会取CPU核数 * 2 作为默认线程数
    //threadFactory 为null
    // args里面有 
    //	 SelectorProvider.provider()、
    //   DefaultSelectStrategyFactory.INSTANCE===》new DefaultSelectStrategyFactory()
    //   RejectedExecutionHandlers.reject() ===》 new RejectedExecutionHandler()
    super(nThreads == 0 ? DEFAULT_EVENT_LOOP_THREADS : nThreads, threadFactory, args);
}

继续找构造方法会找到MultithreadEventExecutorGroup的构造方法

protected MultithreadEventExecutorGroup(int nThreads, Executor executor, Object... args) {
    // nThreads 不传就是0 如果是0的话,会取CPU核数 * 2 作为默认线程数
    //executor 为null
    //新增了一个参数 DefaultEventExecutorChooserFactory
    // args里面有 
    //	 SelectorProvider.provider()、
    //   DefaultSelectStrategyFactory.INSTANCE===》new DefaultSelectStrategyFactory()
    //   RejectedExecutionHandlers.reject() ===》 new RejectedExecutionHandler()
    this(nThreads, executor, DefaultEventExecutorChooserFactory.INSTANCE, args);
}

继续往下找构造方法

protected MultithreadEventExecutorGroup(int nThreads, Executor executor,
                                        EventExecutorChooserFactory chooserFactory, Object... args) {
    //非主线代码可以不看
    // if (nThreads <= 0) {
    //     throw new IllegalArgumentException(String.format("nThreads: %d (expected: > 0)", nThreads));
   //  }
		
    if (executor == null) {
        //ThreadPerTaskExecutor 这个主要是用来新建线程来执行任务的,
        //newDefaultThreadFactory()=线程工厂  专门创建线程的
        //newDefaultThreadFactory()调用的是 MultithreadEventLoopGroup.newDefaultThreadFactory()
        //最终创建的是DefaultThreadFactory,他实现了继承自jdk的ThreadFactory
        executor = new ThreadPerTaskExecutor(newDefaultThreadFactory());
    }

    //children 就是标识boss线程组或者work线程组一共有几个线程,
    //从代码分析上来看我们没有指定executor 所以线程的创建默认由ThreadPerTaskExecutor负责
    children = new EventExecutor[nThreads];

    for (int i = 0; i < nThreads; i ++) {
        //出现异常标识 
        boolean success = false;
        try {
            //创建nThreads个nioEventLoop保存到children数组中
            //newChild()是个抽象方法,可以看到实现类NioEventLoopGroup实现了此方法
            //创建NioEventLoop对象
            children[i] = newChild(executor, 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);
        } finally {
            //出现异常处理 非主线代码可以不看
            /*
            if (!success) {
                for (int j = 0; j < i; j ++) {
                    children[j].shutdownGracefully();
                }

                for (int j = 0; j < i; j ++) {
                    EventExecutor e = children[j];
                    try {
                        while (!e.isTerminated()) {
                            e.awaitTermination(Integer.MAX_VALUE, TimeUnit.SECONDS);
                        }
                    } catch (InterruptedException interrupted) {
                        // Let the caller handle the interruption.
                        Thread.currentThread().interrupt();
                        break;
                    }
                }
            }*/
        }
    }

    //children是NioEventLoop的对象数组 
    //chooser=GenericEventExecutorChooser/PowerOfTwoEventExecutorChooser
    //chooser的意思是我要选择从NioEventLoop[]选一个线程出来工作的,是通过什么规则选的。
    chooser = chooserFactory.newChooser(children);

    final FutureListener<Object> terminationListener = new FutureListener<Object>() {
        @Override
        public void operationComplete(Future<Object> future) throws Exception {
            if (terminatedChildren.incrementAndGet() == children.length) {
                terminationFuture.setSuccess(null);
            }
        }
    };

    for (EventExecutor e: children) {
        e.terminationFuture().addListener(terminationListener);
    }

    //复制一份children  只读的
    Set<EventExecutor> childrenSet = new LinkedHashSet<EventExecutor>(children.length);
    Collections.addAll(childrenSet, children);
    readonlyChildren = Collections.unmodifiableSet(childrenSet);
}

三、总结

​ new NioEventLoopGroup()的构造方法分析,主要还是找到了父类MultithreadEventExecutorGroup的构造方法。每经过一层构造方法调用,会给一些默认的参数值。最终的参数值有

​ 1、 nThreads 不传就是0 如果是0的话,会取CPU核数 * 2 作为默认线程数,用来做boss线程组/woker线程组的线程数。

​ 2、threadFactory 线程工厂创建使用的 因为没有指定所以 为null 最终使用的是netty实现的默认线程工厂。

​ 3、executor 因为没有指定所以 为null,使用的是netty实现的ThreadPerTaskExecutor(),并且把threadFactory 做为构造参数,主要负责通过threadFactory 创建线程。

​ 4、SelectorProvider.provider() jdk原生的 SelectorProvider ,用来创建ServerSocketChannel。

​ 5、EventExecutorChooserFactory 从NioEventLoop[]选一个线程出来工作的,是通过什么规则选的。 使用的netty实现的 DefaultEventExecutorChooserFactory

​ 6、DefaultSelectStrategyFactory 选择策略工厂,DefaultSelectStrategyFactory.INSTANCE===》new DefaultSelectStrategyFactory()

​ 7、RejectedExecutionHandler 拒绝策略 RejectedExecutionHandlers.reject() ===》 new RejectedExecutionHandler()

以上参数的使用地方有:
NioEventLoopGroup 继承 MultithreadEventExecutorGroup ,
children = new EventExecutor[nThreads];
chooser = chooserFactory.newChooser(children);
children[i] = newChild(executor, args);
主要核心代码为 children[i] = newChild(executor, args); 后续再继续分析newChild里面做了什么事情。

Netty源码分析:NioEventLoopGroup Netty学习笔记:NioEventLoopGroup在工作之余,看到自己公司的超哥(俞超)关于Netty的系列博文,讲解的很好,因此,自己在学习之余也跟了下源代码,来了解Netty,也做了相关的笔记,将形成系列博文,这是第一篇。超哥的博文地址在这里:http://www.jianshu.com/p/c5068caab217Netty版本:4.0.23.Final借用超哥的例子,一般服务端的代码如下 阅读详情

相关推荐

[netty源码分析]--EventLoopGroup与EventLoop 分析netty的线程模型

netty核心类源码解析:分析netty的运行机制 EventLoopGroup与EventLoop解析:分析netty的线程模型 这一篇博文主要是从源码层次分析netty的线程模型。netty之所以是高性能NIO框架,其中主要贡献之一就是netty的线程模型的高性能,我们都知道netty的线程模型是基于Reactor线程模型,下面我们就来分析一下对于netty的reactor

惜暮 1万+

Netty学习笔记(四)NioEventLoopGroup分析

引子 在上一篇文章中我们已经分析了Netty注册相关的逻辑,接下来再开看下NioEventLoopGroup这个类内部的相关构造。 NioEventLoopGroup 在之前的demo中第一行就是: EventLoopGroup bossGroup = new NioEventLoopGroup(1); 这个NioEventLoopGroup类的构造函数最终实现如下: protected MultithreadEventExecutorGroup(int nThreads, E..

qililong88的博客 553

netty案例,netty4.1源码分析篇一《NioEventLoopGroup源码分析》

本章节我们从一个基础构建的基础NettyServer来分析NioEventLoopGroup源码,其中包括了;EventLoopGroup事件循环组、NioEventLoopGroup异步事件循环组、MultithreadEventLoopGroup多线程事件循环组等。 启动NettyServer的模版代码 private void bing(int port) { EventLoopGro...

bugstack虫洞栈 1910

Netty中NioEventLoopGroup介绍

Netty中的核心类之一的:NioEventLoopGroup

小飞侠的博客 2413

Android 音频源码分析——音量调节流程

源码分析基于android9.0 一、声音类型 对于大多数手机用户来说,操作手机音量按键可以看到,声音类型分为四种:媒体、铃声、闹钟、通话,但是其系统内部则分为十几种类型。 声⾳类型用来区分不同播放用途及播放设备,包含11中类型 定义在 frameworks/base/media/java/android/media/AudioSystem.java中 /** Used to identify the default audio stream volume */ public static final in

奋斗的菜鸟ing 3824

数据分析—用户行为数据分析

一般价值用户(R高F高M低):用户处于购买活跃期,感兴趣的商品多,购买次数少 → 针对该部分客户,目的就是要让他们购买,所以可以和运营部门沟通,降低利润,给出有力折扣促进购买,进而转为重要价值用户。重要价值用户(R高F高M高)维护:用户处于购买活跃期,感兴趣的商品多,购买次数也多 → 针对兴趣产品,保持一定频率的触达,持续维护。

m0_74091312的博客 1421

Netty源码分析之三【我就是大名鼎鼎的 EventLoop】

简述这一章是 Netty 源码分析 的第三章, 我将在这一章中大家一起探究一下 Netty 的 EventLoop 的底层原理, 让大家对 Netty 的线程模型有更加深入的了解.NioEventLoopGroup在[Netty 源码分析之 一 揭开 Bootstrap 神秘的红盖头]章节中我们已经知道了, 一个 Netty 程序启动时, 至少要指定一个 EventLoopGroup(如果使用到的是

极客神殿 1039

vTaskStartScheduler()详解

是启动 FreeRTOS 实时内核的“扳机”。在调用它之前,你只是创建了一些任务结构,但它们都处于“待命”状态,系统仍然在按传统的裸机前后台方式运行。调用这个函数后,FreeRTOS 内核会接管系统的控制权,开始根据优先级调度你创建的任务,多任务环境才真正开始。关键点:它没有参数。它的所有行为都由中的配置宏控制。它通常不会返回。一旦调用,除非没有任务可以运行(或者你显式地停止了调度器),否则程序流永远不会回到main()函数中调用它的下一行。是一个没有参数但行为由精密控制的函数。

Shylock_Mister的博客 1596

[Netty源码] NioEventLoop相关问题 (四)

[Netty源码] NioEventLoop相关问题 (四), NioEventLoop的创建, 启动, 运行逻辑, 以及空轮询bug的解决方法, 如何异步串行无锁化等问题的解决方法

959 577

PCL 加权局部最优投影(WLOP)简化算法

WLOP算法是一种点云重采样方法,通过迭代优化实现点云均匀化和特征保留。算法包含数据项(加权平均位置保持几何特征)和正则化项(排斥邻近点实现均匀分布)两部分。代码实现基于PCL库,通过KD树加速邻域搜索,使用高斯权重函数计算点位置更新。参数包括输出点比例、邻域半径、正则化权重和迭代次数。该算法不依赖网格信息,适合处理大规模扫描数据的预处理优化。

点云侠的博客 633

YOLOv8【第十一章:视频追踪与流处理篇·第16节】一文搞懂,DeepStream 部署入门:NVIDIA 视频分析 SDK 与 YOLOv8 结合!

🏆 本文收录于 《YOLOv8实战:从入门到深度优化》 专栏。该专栏系统复现并梳理全网各类 YOLOv8 改进与实战案例(当前已覆盖分类 / 检测 / 分割 / 追踪 / 关键点 / OBB 检测等方向),坚持持续更新 + 深度解析,质量分长期稳定在 97 分以上,可视为当前市面上 覆盖较全、更新较快、实战导向极强 的 YOLO 改进系列内容之一。

**My Coding Family** 841

Netty Review - NioEventLoopGroup源码解析

这段代码是在使用Netty框架时常见的用法,用于创建两个不同的实例,一个用于处理连接请求(通常称为bossGroup),另一个用于处理连接后的数据流(通常称为workerGroup)。是Netty中用于处理NIO事件的的实现之一。在Netty中,事件循环(EventLoop)是Netty的核心,负责处理各种事件,比如接收连接、读取数据、写入数据等。其主要功能和构造函数参数的含义:第一个构造函数参数表示创建的EventLoop的数量。

小工匠 8274

如何让C++程序生成dump文件?生成dump文件的方式有哪些?如何使用Windbg分析dump文件?

本文详细介绍了如何让C++程序生成dump文件、生成dump文件的多种方式以及如何使用Windbg分析dump文件,并给出了对应的实战分析案例,有一定的实战参考价值。

dvlinker的技术专栏 5万+

netty之NioEventLoopGroup

Netty的NioEventLoopGroup及NioEventLoop初始化工作的源码阅读笔记, 如下图,是Netty的Reactor线程模型图,本文描述NioEventLoopGroup等价于我在图中标红的MainReactor组件,全篇围绕它的初始化展开,难免地方理解的不正确 在Nio网络编程模型的图示是下面那张图, 单条Thread全职执行一个Selector,首先是服务端在启动的时候,会把代表服务端的ServerSockerChannel注册进Selector,且感兴趣的事件是Accept, 一

追逐消失的记忆 1万+

ruoyi-nbcio-plus基于vue3的flowable服务任务的升级修改

ruoyi-nbcio-plus基于vue3的flowable服务任务的升级修改

宁波阿成的博客 847

非洲秃鹫优化算法(AVOA)详解:从原理到实战

非洲秃鹫优化算法(AVOA)是一种模拟秃鹫觅食行为的元启发式算法。该算法通过数学建模秃鹫的群体分工、饥饿感知和食物竞争等行为,将优化问题转化为智能觅食过程。AVOA包含四个关键阶段:(1)种群初始化与最佳秃鹫选择;(2)饥饿率控制探索与开发平衡;(3)探索阶段模拟远距离飞行搜索;(4)开发阶段模拟食物源附近的竞争行为。算法采用饥饿率函数实现自适应搜索,初期偏向全局探索,后期转向局部开发。实验表明AVOA在标准测试函数和工程设计问题上表现出优越性能,其创新性在于将秃鹫独特的生物学特性转化为高效的优化机制。

qq_42212808的博客 229

吃透Netty源码系列一之NioEventLoopGroup

Netty源码深度解析系列一前言Netty的Reactor模式 前言 netty更新的是快,最新发布版本已经是4.1.45.Final了,以前有学过netty,觉得学的还不够深入,这次打算从源码级别去更加深入的理解内部机制。我不想介绍太多关于netty是什么,怎么用,我更想介绍一下原理,这样才能更好的去使用它,扩展它,完善它。我打算从常用的一些类开始介绍,比如NioEventLoopGroup S...

王伟王胖胖的博客 5662

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Netty之NioEventLoopGroup源码分析

本文是对Netty中NioEventLoopGroup的简单分析,该类是连接接入的入口,它负责新连接的接入与连接事件的处理,接下来我会从使用它的角度去分析该类的作用,通过本文你将了解到Netty是如何创建线程去处理连接的,如果文章中有错误希望能够指出,谢谢。 NioEventLoopGroup之大管家 我们在编写Netty服务的时候,首先会创建bossGroup与workerGroup,如下...

qq_37803406的博客 502

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Netty——NioEventLoopGroup源码分析

摘要 提到Netty首当其冲被提起的肯定是支持它承受高并发的线程模型,说到线程模型就不得不提到NioEventLoopGroup这个线程池。 线程模型 Netty的线程模型被称为Reactor模型,具体如图所示,图上的mainReactor指的就是bossGroup,这个线程池处理客户端的连接请求,并将accept的连接注册到subReactor的其中一个线程上;图上的subReactor当然指的就是workerGroup,负责处理已建立的客户端通道上的数据读写;图上还有一块ThreadPool是具体

庄小焱 529

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Netty源码分析系列之NioEventLoop

这里从我们之前创建Netty服务端和客户端例子出发(第一个就是创建NioEventLoopGroup对象)出发 本篇文章分析了Netty的三种经典的Reactor线程模型,同时分析了线程模型的实现类NioEventLoop从其创建和启动两个角度对该类进行详细的分析,希望对读者学习netty框架有所帮助

liushangzaibeijing的博客 5万+

NioEventLoopGroup 源码分析

NioEventLoopGroup 源码分析1. 在阅读源码时做了一定的注释,并且做了一些测试分析源码内的执行流程,由于博客篇幅有限。为了方便 IDE 查看、跟踪、调试 代码,所以在 github上提供 netty 的源码、详细的注释及测试用例。欢迎大家 star、fork !2. 由于个人水平有限,对源码的分析理解可能存在偏差或不透彻的地方还请大家在评论区指出,谢谢!从今天开始,就准备进军 ne...

James的博客 1011

netty源码分析5-NioEventLoopGroup

分享内容如下: NioEventLoopGroup初始化分析 NioEventLoopGroup父子类分析 parentGroup与childGroup区别 1.NioEventLoopGroup初始化分析 从接口类图上看 EventLoopGroup 继承了 线程池和定时线程池功能,判断EventLoopGroup具有线程池的复合功能。从命名猜测 EventLoopGroup 管理了一组...

chenchangqun11的专栏 565

netty之NioEventLoopGroup源码分析二

大家好,今天我准备死磕NioEventLoopGroup的源码,首先讲下概念,NioEventLoopGroup 它是一个线程池,存放NioEventLoop,一个数组,今天打算先看下这行代码的初始化 EventLoopGroup bossGroup = new NioEventLoopGroup(); 一、初始化 1、时序图: 2.类的关系 3.源码说明: ...

weixin_30379911的博客 134

Netty源码分析之NioEventLoopGroup创建

NioEventLoopGroup的创建   服务端一般是通过创建两个NioEventLoopGroup来创建NioEventLoop,一个NioEventLoopGroup主要是用于接收客户端的请求,另外一个NioEventLoopGroup则是处理网络IO的相关读写操作,或者是执行定时任务,或者是系统任务。 bossGroup = new NioEventLoopGroup(); w...

weixin_30265103的博客 220

Netty源码分析篇:NioEventLoopGroup分析

Netty源码分析篇:NioEventLoopGroup分析

java_rutu的博客 666

Netty源码分析——NioEventLoopGroup & NioEventLoop

目录   1、NioEventLoopGroup 1.1 类图 1.2 初始化 1.创建线程执行器 2.创建EventLoop,并存储到EventExecutor类型的数组中 3.创建线程选择器 2、NioEventLoop 2.1 类图 2.2 selector 2.3 run 1.轮询io事件 2.处理轮询到的key 3.执行任务队列中的task 1、NioEve...

weixin_43599368的博客 800
上一篇: 第一节 netty源码分析之简单应用
下一篇: 第三节 netty源码分析之NioEventLoopGroup的 newChild()方法分析
Resee_Z
博客等级 码龄11年 2粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值