《Netty》从零开始学netty源码(五十八)之NioEventLoop.execute()

news2024/11/28 10:56:30

目录

  • NioEventLoop.execute()
    • addTask()
    • startThread()
    • NioEventLoop.run()
    • select()
    • 处理keys与执行任务
    • processSelectedKeys()
      • 处理AbstractNioChannel
      • selectAgain()
    • runAllTasks()
      • fetchFromScheduledTaskQueue()
      • runAllTasksFrom()
      • afterRunningAllTasks()
    • 带截止时间的runAllTasks()
    • unexpectedSelectorWakeup()
    • rebuildSelector0()

NioEventLoop.execute()

在前一篇多次看到向eventloop中提交任务,本篇就分析该方法的源码过程。

在这里插入图片描述

在这个过程中最关键的是两步:

  1. 将task添加到taskQueue中的addTask()方法
  2. 启动任务线程startThread()

addTask()

在这里插入图片描述

startThread()

在这里插入图片描述

startThread()中主要是向NioEventLoop的executor中提交一个任务,当获得线程资源之后调用NioEventLooprun()方法。

NioEventLoop.run()

在这里插入图片描述

run()中主要是一个死循环,该循环不断执行三个过程:

  1. 调用select()方法获取已经就绪的channel并将channel对应的key存放到NioEventLoopselectionKeys
  2. 处理selectionKeys中的key,执行任务队列taskQueue中的任务
  3. 记录select的次数,如果空轮询次数过多或者出现异常情况则重新建立selector

select()

在这里插入图片描述

处理keys与执行任务

在这里通过ioRatio来平衡IO事件与非IO事件的处理时间。
在这里插入图片描述

processSelectedKeys()

在这里插入图片描述

处理AbstractNioChannel

在这里插入图片描述

selectAgain()

在这里插入图片描述

runAllTasks()

runAllTasks()分两种情况,一种是不限制处理时间,一种是限制处理时间的。
在这里插入图片描述

fetchFromScheduledTaskQueue()

在这里插入图片描述

runAllTasksFrom()

在这里插入图片描述

afterRunningAllTasks()

在这里插入图片描述

带截止时间的runAllTasks()

带截止时间的runAllTasks()过程如下,如果处理tasks的时间超时则停止处理。
在这里插入图片描述

unexpectedSelectorWakeup()

Netty为了解决空轮询bug在run()方法中设立了一个selectCnt变量,每执行一次selectCnt+1,当空轮询达到512次时建立一个新的selector。

在这里插入图片描述

rebuildSelector0()

在这里插入图片描述

最后总结一下整个execute()的过程。

在这里插入图片描述

至此,NioEventLoop.execute()的过程分析至此结束,感谢阅读。
请添加图片描述

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

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

相关文章

国考省考行测:图形推理题1,2平移,旋转,翻转

国考省考行测:图形推理题1,2平移,旋转,翻转 2022找工作是学历、能力和运气的超强结合体! 公务员特招重点就是专业技能,附带行测和申论,而常规国考省考最重要的还是申论和行测,所以大家认真准备吧&#xff…

[数据结构 -- C语言] 栈(Stack)

目录 1、栈 1.1 栈的概念及结构 2、栈的实现 2.1 接口 3、接口的实现 3.1 初始化 3.2 入栈/压栈 3.3 出栈 3.4 获取栈顶元素 3.5 获取栈中有效元素个数 3.6.1 bool 类型接口 3.6.2 int 类型接口 3.7 销毁栈 4、完整代码 5、功能测试 1、栈 1.1 栈的概念及结构 …

软件测试工程师简历要怎么写,才能让HR看到

作为软件测试的从业者,面试或者被面试都是常有的事。 可是不管怎样,和简历有着理不清的关系,面试官要通过简历了解面试者的基本信息、过往经历等。】、 如果你不知道软件测试简历怎么写,可以看看这个视频是怎么写的,…

ARM-底层/Day2

.text .global _start _start:mov r0,#9mov r1,#15bl cmp_funccmp_func:cmp r0,r1beq stop 相等则跳转结束 subhi r0,r0,r1subcc r1,r1,r0mov pc,lr 不相等则返回执行 stop: b stop .end 循环实现1~100之间的和 .text .global _start _start:mov r0,#0mov r1,#1bl sum_fun…

CCF-CSP 202104-1 灰度直方图

简单的一题&#xff0c;理解题意&#xff0c;使用哈希数组即可 #include<iostream>using namespace std;int L,n,m; int mapp[505][505]; int arr[300];int main(){cin>>n>>m>>L;for(int i0;i<n;i){for(int j0;j<m;j){cin>>mapp[i][j];arr…

C++之STL

一、六大组件&#xff1a; 容器&#xff1a; 各种数据结构&#xff0c;如vector、list、deque、set、map等,用来存放数据&#xff0c;从实现角度来看&#xff0c;STL容器是一种class template。 算法&#xff1a; 各种常用的算法&#xff0c;如sort、find、copy、for_each。…

你也可以成为营销策划大咖,只需掌握这些技巧

本人是从业营销策划行业近10年的老广告人&#xff0c;我说的话你可以选择相信。 千万不要看轻了广告策划这个职业的技术含量&#xff0c;不是说你语言文字能力比较好就一定能够适合这个行业。 想要进入这个行业的大公司&#xff0c;你如果是刚毕业的新人的话&#xff0c;首先…

Linux的使用

强制停止 ctrlc 停止程序的运行退出当前命令的输入 退出或登出 ctrld 退出账户的登录退出某些特定程序的专属页面不能用于退出vi/vim 历史命令搜索 查看历史输入过的命令 history可通过! 命令前缀&#xff0c;自动执行上一次匹配前缀的命令&#xff08;用于最近的2~3/4~5个…

SpringBoot中如何处理MySQL中存储的JSON数据?

目录 一、MySQL中如何保存JSON类型的数据 1.1 建表 1.2 保存一条带json的记录 1.3 查询 二、Springboot操作当前数据库表 2.1 方式一&#xff08;推荐&#xff09; 2.2 方式二 JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式 。简洁…

Nginx安装及其常用命令(实操版)

Nginx安装及其常用命令&#xff08;实操版&#xff09; 一、安装Nginx1、准备工作2、开始进行 nginx 安装 二、Nginx常用命令三、nginx.conf配置文件1、位置2、配置文件中的内容&#xff08;包含三部分&#xff09; 四、Nginx 反向代理实例 21、实现效果2、准备工作 五、Nginx …

从萌芽到巨人: 揭秘Rod Johnson与Spring框架的故事

前言 在这个充满创意和技术追求的世界中&#xff0c;有一个名为 Spring 的框架&#xff0c;它孕育了无数创新和成功的故事。这是一个关于持续进化和超越自我的故事&#xff0c;一个激励人心的旅程&#xff0c;由一位富有远见的程序员和他的团队引领着。从最初的概念到如今的成熟…

【Vue3+TS项目】硅谷甄选day02--后台管理系统模板搭建/项目配置

1 项目初始化 一个项目要有统一的规范&#xff0c;需要使用eslintstylelintprettier来对我们的代码质量做检测和修复&#xff0c;需要使用husky来做commit拦截&#xff0c;需要使用commitlint来统一提交规范&#xff0c;需要使用preinstall来统一包管理工具。 1.1 环境准备 n…

存储系统及主存储器

存储器概述 分类 存储器的分类如下&#xff1a; 主存的分类&#xff1a; 主存分为随机存储器&#xff08;RAM&#xff09;和静态存储器&#xff08;RAM&#xff09;&#xff0c;随机存储器又分为静态RAM和动态RAM 存储器的层次结构 金字塔结构 主存-辅存及主存-缓存结构 …

CentOS安装MySQL5.7/8.0

CentOS安装MySQL 0. 官方教程1. 添加MySQL Yum存储库1.1 官网下载yum存储库1.2 本地安装存储库 2. 安装MySQL数据库2.1 安装MySQL5.72.2 安装MySQL8.0 3. 开启并设置MySQL服务自启动4. 修改数据库root用户密码5. 设置root用户远程连接数据库【可选】 0. 官方教程 官网教程链接…

用xshell把本地的文件夹传入服务器中,在两个服务器之间互传文件夹

两个服务器之间互传文件 假设有两个服务器A和B&#xff0c;现在你需要把A里面的东西传入B里面。 进入B服务器&#xff0c;如你想把A服务器中/root/one/unet放在B服务器中root/ww下&#xff0c;输入以下命令 scp -r -P YYY rootXX.XX.XXX.XX:/root/one/unet root/ww其中YY是你…

深度异常检测入门

异常检测定义 Anomaly detection。异常检测是对与标准行为或模式显著不同的罕见事件、项目或可疑观察的识别。异常也被称为异常值、噪声、偏差等。 对于异常的理解&#xff1a; 异常不一定是无用的&#xff0c;部分异常对数据挖掘领域有较大的价值不同的场景下&#xff0c;异…

CHATGPT的前世今生

ChatGPT是一款基于GPT&#xff08;Generative Pre-trained Transformer&#xff09;模型的聊天机器人&#xff0c;它的前世今生充满着令人惊叹的故事。在这篇文章中&#xff0c;我们将深入探讨ChatGPT的诞生、发展和未来。 一、ChatGPT的起源 ChatGPT是由OpenAI团队开发的一款…

夏驰和徐策的解决数学问题思路之——数学归纳法

前言&#xff1a; 今天在复习概率论1.2.3 事件的概率及其性质中证明性质2有限可加性中运用到了数学归纳法&#xff0c;我对数学归纳法早有听闻&#xff0c;但是一直不知道怎么用这个方法&#xff0c;其实数学归纳法早在高中我们就已经接触到了在人教版教材选修2中就有这个方法…

ChatGPT 3.5 API的调用不全指南(持续更新ing...)

诸神缄默不语-个人CSDN博文目录 最近更新时间&#xff1a;2023.5.17 最早更新时间&#xff1a;2023.5.17 关于怎么才能上ChatGPT、怎么才能获取API额度等等信息&#xff0c;建议直接见我的medium账号。 因为这不是能在内网发的内容。 本文不涉及相关网络问题。 我本来想靠问…

【云原生|Kubernetes】03-Pod详解

【云原生|Kubernetes】03-Pod详解 文章目录 【云原生|Kubernetes】03-Pod详解前言Pod解析Pod简介Pod的组成Pod中的几种容器的概念Pause容器初始化容器主容器伴随容器容器的启动顺序容器与pod与node的关系 Pod种类普通Pod静态pod静态Pod创建方式配置文件方式http方式 Job PodCro…