Netty技术全解析:EventLoopGroup类详解

news2024/11/15 5:08:55
❃博主首页 : 「码到三十五」 ,同名公众号 :「码到三十五」,wx号 : 「liwu0213」
☠博主专栏 : <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关>
♝博主的话 : 搬的每块砖,皆为峰峦之基;公众号搜索「码到三十五」关注这个爱发技术干货的coder,一起筑基

Netty作为一个高性能的异步事件驱动的网络应用框架,其核心组件之一便是EventLoopGroupEventLoopGroup在Netty中扮演着线程池的角色,负责管理和调度事件循环,是Netty实现高效并发的基础。本文将结合源码详细介绍Netty中EventLoopGroup类的技术原理和实现细节。

EventLoopGroup的角色与功能

EventLoopGroup在Netty中是一个接口,它本质上是一个线程池,用于获取线程并管理线程的生命周期。每个EventLoopGroup包含一组EventLoop,每个EventLoop都是一个单线程执行器,负责处理分配给它的Channel上的所有IO事件。

主要功能

  1. 事件循环调度EventLoopGroup负责调度事件循环的执行,确保每个事件都在正确的线程上被处理。
  2. 线程管理:通过线程池管理EventLoop的生命周期,可以根据需要创建、启动和销毁线程。
  3. 处理器分配:将IO事件分配给相应的处理器链(ChannelPipeline)进行处理。
  4. 定时任务调度:支持定时任务的调度和执行,如链路空闲状态监测、心跳消息发送等。
  5. 优雅关闭:提供了优雅关闭的能力,确保在关闭时等待正在处理的任务完成。

EventLoopGroup的实现原理

EventLoopGroup的默认实现是NioEventLoopGroup,它基于Java NIO的Selector机制实现IO多路复用。下面结合源码分析其实现原理。

初始化过程

当创建NioEventLoopGroup实例时,可以通过构造函数指定线程数量。如果不指定,则默认创建CPU核心数*2个线程。

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

// 省略部分代码...

protected MultithreadEventLoopGroup(int nThreads, Executor executor, Object... args) {
    super(nThreads == 0 ? DEFAULT_EVENT_LOOP_THREADS : nThreads, executor, args);
}

// DEFAULT_EVENT_LOOP_THREADS 是静态常量,默认为CPU核心数*2
private static final int DEFAULT_EVENT_LOOP_THREADS;
static {
    DEFAULT_EVENT_LOOP_THREADS = Math.max(1, SystemPropertyUtil.getInt(
            "io.netty.eventLoopThreads", NettyRuntime.availableProcessors() * 2));
}

线程池的实现

NioEventLoopGroup底层使用Netty自定义的ThreadPerTaskExecutor线程池实现。每个线程都绑定一个EventLoop实例,线程和EventLoop一一对应。

// 在MultithreadEventExecutorGroup中初始化线程
for (int i = 0; i < nThreads; i++) {
    eventExecutors.add(newThread(new DefaultEventExecutor.DefaultRunnableDecorator(r), namePrefix + "-" + i));
}

// DefaultEventExecutor.DefaultRunnableDecorator 封装了Runnable任务
private final class DefaultRunnableDecorator implements Runnable {
    private final Runnable task;

    DefaultRunnableDecorator(Runnable task) {
        this.task = task;
    }

    @Override
    public void run() {
        // 获取当前线程的EventLoop并执行任务
        if (eventExecutor.inEventLoop()) {
            task.run();
        } else {
            eventExecutor.execute(task);
        }
    }
}

事件处理流程

  1. 注册Channel:当一个新的连接被接受时,Netty会注册一个新的Channel到EventLoopGroup中,并从中选择一个EventLoop绑定到这个Channel上。
  2. 事件循环EventLoop不断地轮询其注册的Channel上的IO事件,一旦有事件就绪,就调用相应的处理器(如ChannelPipeline中的Handler)进行处理。
  3. 任务执行:除了IO事件外,用户还可以提交异步任务到EventLoop执行。这些任务会在IO事件处理完毕后按顺序执行。

优雅关闭

当需要关闭EventLoopGroup时,可以调用shutdownGracefully()方法。该方法会等待正在处理的任务完成后再关闭线程池,确保资源的正确释放。

public final Future<?> shutdownGracefully() {
    // 省略部分代码...
    // 提交关闭任务到全局事件执行器
    globalEventExecutor.execute(() -> {
        if (confirmShutdown()) {
            // 遍历并关闭所有EventExecutor
            for (EventExecutor e: children) {
                e.shutdownGracefully();
                confirmShutdown();
            }
            terminationFuture.setSuccess(null);
        }
    });
    return terminationFuture;
}

总结

EventLoopGroup作为Netty框架中的核心组件之一,通过高效的线程管理和事件调度机制,确保了Netty能够快速响应各种网络事件,保持网络通信的流畅和高效。通过对其实现原理的深入理解,我们可以更好地利用Netty框架开发高性能的网络应用。


关注公众号[码到三十五]获取更多技术干货 !

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1937967.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VBA技术资料MF174:利用文本框和列表框录入数据

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

Ubuntu网络连接图标消失了,没网!!!

文章目录 前言Step1&#xff1a;停止网络管理服务Step2&#xff1a;删除网络管理状态文件Step3&#xff1a;打开网络管理 前言 本次记录的事&#xff0c;有一天心血来潮想烧录一下开发板&#xff0c;却发现自己的Ubuntu系统的网络连接图标消失了&#xff0c;也没网了&#xff…

DEBUG:inpyb无法引用本地的py文件

问题 无法import 解决 暂时合并为一个文件 直接执行且测试简单模块可以引用&#xff08;部分复杂文件无法引用&#xff09;结合本程序 应该需要修改不规则的正则表达式 发现部分警告导致程序无法引用&#xff08;而且和环境有关 linux不会&#xff09;

医联体信息平台建设方案PPT(54页)

文章摘要&#xff1a; 医联体信息平台现状当前医联体信息平台存在脱离医疗业务建设的倾向&#xff0c;导致信息孤岛&#xff0c;业务协同困难。 建设存在的问题主要问题包括健康档案无法动态更新和共享&#xff0c;信息系统之间信息共享和协同不足。 医联体信息平台建设方案方…

【Linux】进程间通信及管道详细介绍(上)

前言 本节我们开始学习进程间通信相关的知识&#xff0c;并详细探讨一下管道&#xff0c;学习匿名管道和命名管道的原理和代码实现等相关操作… 目录 1. 进程间通信背景1.1 进程通信的目的&#xff1a; 2 管道的引入&#xff1a;2.1 匿名管道&#xff1a;2.1.1 匿名管道的原理&…

LATEX模板支持中文、目录和段落

\documentclass{ctexart} \usepackage{amsmath,amssymb,amsfonts,hyperref} \usepackage{CJKutf8} \usepackage{enumitem} % 引入宏包 \usepackage [colorlinkstrue] {} \begin{document}\begin{CJK}{UTF8}{gkai}%正文放在此行下与\end{CJK}之间就行\tableofcontents\newpage\s…

【Python】从基础到进阶(四):深入了解Python中的控制流

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 一、引言二、条件语句1. if 语句2. if-else 语句3. if-elif-else 语句4. 嵌套条件语句5. 三元运算符 三、循环语句1. for 循环基本语法使用range() 函数遍历列表、字典和字符串 2. while 循环基本语法无限循环与终止条件 3.…

Python 实现股票指标计算——BBI

BBI (Bull And Bear lndex) - 多空指标 1 公式 3日均价 3日收盘价之和 / 36日均价 6日收盘价之和 / 612日均价 12日收盘价之和 / 1224日均价 24日收盘价之和 / 24BBI (3日均价 6日均价 12日均价 24日均价) / 4 2 数据准备 我们以科创50指数 000688 为例&#xff0c…

使用Vue实现点击页面触发特效

效果描述 在页面上的指定区域内进行点击&#xff0c;则会在页面上显示设置好的随机文本&#xff0c;此文本出现后会执行动画&#xff0c;动画效果为节点在1s之内向右上方移动并在移动的过程中完成180翻转&#xff0c;最后消失。 效果展示 完整代码 <template><div…

Windows 11 Visual Studio 2022 cmake 3.29 CUDA12.5 构建VTK

The Visualization Toolkit (VTK)是一个用于操作和展示科学数据的开源软件&#xff0c;包括了二三维渲染功能。 下载VTK 从官网Download | VTK下载VTK版本&#xff0c;我下载的是9.3.1源代码&#xff0c;在Windows 11上安装。 CMake构建VTK的VS2022工程 生成与安装 分别生成De…

AI智能名片小程序:跨界融合,重塑品牌与顾客的“三度情缘”

在这个信息爆炸、竞争白热化的时代&#xff0c;品牌如何突破重围&#xff0c;与顾客建立超越常规的情感链接&#xff1f;答案或许就藏在那个看似不起眼&#xff0c;实则暗藏玄机的AI智能名片小程序里&#xff01;它不仅是技术的结晶&#xff0c;更是品牌与顾客之间“三度情缘”…

Redis持久化(AOF和RDB)

目录 前言 一.RDB 1.1手动执行 1.2自动执行 二.AOF 2.1重写机制 三.混合持久化 Redis的学习专栏&#xff1a;http://t.csdnimg.cn/a8cvV 前言 持久化&#xff0c;在之前&#xff0c;我们接触这个词汇是在mysql数据库当中的事务四大特性里。 持久性&#xff1a;指一旦事…

探索免费隧道服务:为本地开发提供自定义子域名的解决方案

目录 引言 使用Ngrok进行本地开发 免费替代方案 Localtunnel Serveo Ngrok付费计划&#xff08;有限的免费试用&#xff09; 开源替代方案 SISH 总结 引言 在Web开发中&#xff0c;将本地服务器暴露给互联网进行测试或演示是常见需求。Ngrok等工具因其便捷性而广受欢迎…

【LeetCode】分隔链表

目录 一、题目二、解法完整代码 一、题目 给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你应当 保留 两个分区中每个节点的初始相对位置。 示例 1&#xff1a; 输入&a…

等保-Linux等保测评

等保-Linux等保测评 1.查看相应文件&#xff0c;账户xiaoming的密码设定多久过期 rootdengbap:~# chage -l xiaoming Last password change : password must be changed Password expires : pass…

day5 分布式节点

文章目录 1 流程回顾2 抽象 PeerPicker3 节点选择与 HTTP 客户端4 实现主流程5 main 函数测试。6 QA 本文代码地址&#xff1a; 本文是7天用Go从零实现分布式缓存GeeCache的第五篇。 注册节点(Register Peers)&#xff0c;借助一致性哈希算法选择节点。实现 HTTP 客户端&…

OpenGL-ES 学习(7) ---- VBO EBO 和 VAO

目录 VBO(Vertex Buffer Object)EBO(Element Buffer Object)VAO(Vertex Array Object) VBO(Vertex Buffer Object) EBO(Element Buffer Object) VBO(Vertex Buffer Object) 实际是指顶点缓冲器对象 在 opengl-es 2.0 的编程中&#xff0c;用于绘制图元的顶点数据是从 CPU 传…

LoadRunner-Vugen脚本使用教程

1 使用VuGen录制脚本 1.1新建脚本和解决方案 &#xff08;1&#xff09;打开VuGen&#xff0c;单击【File】→【New Script and Solution】创建项目&#xff0c;弹出Create a New Script对话框。 左侧栏是协议分类&#xff0c;每项含义如下所示&#xff1a; ● Single Pro…

数字通云平台 智慧政务OA PayslipUser SQL注入漏洞复现

0x01 产品简介 数字通云平台智慧政务OA产品是基于云计算、大数据、人工智能等先进技术,为政府部门量身定制的智能化办公系统。该系统旨在提高政府部门的办公效率、协同能力和信息资源共享水平,推动电子政务向更高层次发展。 0x02 漏洞概述 数字通云平台 智慧政务OA Paysli…

pytorch学习(六)transforms使用

1.Transforms可以对训练图像进行预处理&#xff0c;以提高模型的稳定性&#xff0c;提高泛化能力。其中包含&#xff1a; 中心裁剪、数据标准化、缩放、裁剪、旋转、仿射、反转、填充、噪声添加、灰度变换、线性变换、亮度饱和度以及对比度变换等。 所处理的图像用tensorboard…