Netty实战(七)EventLoop和线程模型

2023-10-26

一、什么是线程模型

简单地说,线程模型指定了操作系统、编程语言、框架或者应用程序的上下文中的线程管理的关键方面。

在早期的 Java 语言中,我们使用多线程处理的主要方式无非是按需创建和启动新的 Thread 来执行并发的任务单元,这种在高负载下表现得很原始。Java 5 随后引入了 Executor API,其线程池通过缓存和重用Thread 极大地提高了性能。

基本的线程池化模式可以描述为:

  • 从池的空闲线程列表中选择一个 Thread,并且指派它去运行一个已提交的任务(一个Runnable 的实现);
  • 当任务完成时,将该 Thread 返回给该列表,使其可被重用。

就像这样,线程再步骤3和4之间无限循环:
在这里插入图片描述

这种模式有个缺陷就是:
虽然池化和重用线程相对于简单地为每个任务都创建和销毁线程是一种进步,但是它并不能消除由上下文切换所带来的开销。这种开销将随着线程数量的增加很快变得明显,并且在高负载下愈演愈烈。此外,仅仅由于应用程序的整体复杂性或者并发需求,在项目的生命周期内也可能会出现其他和线程相关的问题。

二、EventLoop 接口

首先介绍一个术语: 运行任务来处理在连接的生命周期内发生的事件是任何网络框架的基本功能。与之相应的编程上的构造通常被称为事件循环

下面我们展示了一个事件循环的基本思想,其中每个任务都是一个 Runnable 的实例。

while (!terminated) {
   
//阻塞,直到有事件已经就绪可被运行
List<Runnable> readyEvents = blockUntilEventsReady();
//遍历处理事件
for (Runnable ev: readyEvents) {
   
ev.run();
}
}

在Netty中 使用了 interface io.netty.channel.EventLoop来搭配事件循环。它采用了两个基本的 API:并发和网络编程。

  • 首先,io.netty.util.concurrent 包构建在 JDK 的 java.util.concurrent 包上,用来提供线程执行器。
  • 其次,io.netty.channel 包中的类,为了与 Channel 的事件进行交互,扩展了这些接口/类。

它的的类层次结构就像下面一样:

在这里插入图片描述
看起来比较复杂&

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Netty实战(七)EventLoop和线程模型 的相关文章

  • HTTP 状态 404 - 请求的资源不可用

    在使用 MyEclipse IDE 中的 Tomcat 服务器和 Struts 2 框架时 我遇到了反复出现的问题 我将我的程序作为服务器应用程序运行 当它运行时 默认的index jsp 文件将成功打开 但应用程序的其他过去都不起作用 当
  • 任务“:app:dexDebug”执行失败

    我目前正在处理我的项目 我决定将我的 Android Studio 更新到新版本 但在我导入项目后 它显示如下错误 Information Gradle tasks app assembleDebug app preBuild UP TO
  • Android - 如何访问 onResume 中 onCreate 中实例化的 View 对象?

    In my onCreate 方法 我正在实例化一个ImageButton View public void onCreate Bundle savedInstanceState super onCreate savedInstanceSt
  • java中的csv到pdf文件

    我正在尝试获得一个csv文件解析为pdf 到目前为止我所拥有的内容附在下面 我的问题是这段代码最终出现在 pdf 中的文件在 csv 文件的第一行被截断 我不明白为什么 附示例 本质上我想要一个没有任何操作的 csv 文件的 pdf 版本
  • 如何在 Eclipse 中用阿拉伯语读写

    我在 eclipse 中编写了这段代码来获取一些阿拉伯语单词 然后打印它们 public class getString public static void main String args throws Exception PrintS
  • JTree 节点不会被直观地选择

    不知何故 我无法为我的 JTree 节点启用 选择突出显示 我正在我的项目中使用自定义单元格渲染器 这很可能导致此问题 这是完整的渲染器类代码 protected class ProfessionTreeCellRenderer exten
  • 通过 InjectMocks Spy 注入对象

    我需要对一个类运行一系列单元测试 该类具有 Autowired Logger 实现 实现的基本思想是 Mock Logger logger InjectMocks TestedClass tested 但我想保存日志输出功能 Mockito
  • Java 泛型/类型调度问题

    考虑以下程序 import java util List import java util ArrayList public class TypeTest public static class TypeTestA extends Type
  • 如何解决 onEditCommit 事件上的类型不匹配错误?

    我在 Fxml 中使用 onEditCommit 事件在用户编辑数据后检索数据 FXML 代码
  • 使用 Java 在浏览器中下载 CSV 文件

    我正在尝试在 Web 应用程序上添加一个按钮 单击该按钮会下载一个 CSV 文件 该文件很小 大小仅约 4KB 我已经制作了按钮并附加了一个侦听器 文件也准备好了 我现在唯一需要做的就是创建单击按钮时下载 csv 文件的实际事件 假设 fi
  • Java替换特定字符

    这是我在这个网站上的第一个问题 所以我会尽量不要成为一个十足的菜鸟 我目前正在用java 创建刽子手游戏 所以我问你的问题是我们是否被赋予了 幽灵 这个词 并将 Ghost 替换为 hiddenWord ghost length for i
  • 打印包含 JBIG2 图像的 PDF

    请推荐一些库 帮助我打印包含 JBIG2 编码图像的 PDF 文件 PDFRenderer PDFBox别帮我 这些库可以打印简单的 PDF 但不能打印包含 JBIG2 图像的 PDF PDFRenderer尝试修复它 根据 PDFRedn
  • 为什么 ConcurrentHashMap::putIfAbsent 比 ConcurrentHashMap::computeIfAbsent 更快?

    使用 ConcurrentHashMap 我发现computeIfAbsent 比putIfAbsent 慢两倍 这是简单的测试 import java util ArrayList import java util List import
  • 覆盖 MATLAB 默认静态 javaclasspath 的最佳方法

    MATLAB 配置为在搜索用户可修改的动态路径之前搜索其静态 java 类路径 不幸的是 静态路径包含相当多非常旧的公共库 因此如果您尝试使用新版本 您可能最终会加载错误的实现并出现错误 例如 静态路径包含 google collectio
  • OpenJDK 版本控制

    上下文 我想确保我们系统上安装的 Java 不受 CVE 2022 21449 的影响 java version 给出 openjdk version 11 0 7 2020 04 14 LTS OpenJDK Runtime Enviro
  • 从 Stax XMLStreamReader 读取以解组部分

    我正在使用 Stax 游标 API 从大型 xml 文件中提取数据 当前 我转到特殊标签的开头并使用 JAXB 解组该标签 这对于格式良好的 xml 文件效果很好 但不久前我有一个文档 其中数十万个标签中有一个未关闭 JAXB 使用 XML
  • 如何在android sdk上使用PowerMock

    我想为我的 android 项目编写一些单元测试和仪器测试 然而 我遇到了一个困扰我一段时间的问题 我需要模拟静态方法并伪造返回值来测试项目 经过一些论坛的调查 唯一的方法是使用PowerMock来模拟静态方法 这是我的 gradle 的一
  • 重写Object类的finalize()方法有什么用?

    据我所知 在java中如果我们想手动调用垃圾收集器 我们可以执行System gc 1 我们在重写的finalize 方法中做了哪些操作 2 如果我们想手动调用JVM垃圾收集器 是否需要重写finalize 方法 我们在重写的 Finali
  • 如何将实例变量传递到 Quartz 作业中?

    我想知道如何在 Quartz 中外部传递实例变量 下面是我想写的伪代码 如何将 externalInstance 传递到此作业中 public class SimpleJob implements Job Override public v
  • Spring Boot MSSQL Kerberos 身份验证

    目前在我的春季靴子中application properties文件中 我指定以下行来连接到 MSSql 服务器 spring datasource url jdbc sqlserver localhost databaseName spr

随机推荐

  • WinServer 2012 AD 组策略 用户发布软件部署

    本例演示安装 Notepad 这款软件 因为域中发布软件只支持 msi 格式 所以要把 exe 转成 msi 格式 可以用这个软件 https www advancedinstaller com 1 转换格式 1 选择 MSI from E
  • 数学建模 - 数学规划

    来自清风的数学建模课程 主要是用于自己复习看 所以截图较多 数学规划 概述 分类 线性规划 非线性规划 整数规划 0 1规划 线性规划 对于求解最大值要让目标函数的系数 max z min z 线性规划公式 x fval linprog c
  • 第十四届蓝桥杯模拟赛(第一期)——C语言版

    1 二进制位数 问题描述 十进制整数 2 在十进制中是 1 位数 在二进制中对应 10 是 2 位数 十进制整数 22 在十进制中是 2 位数 在二进制中对应 10110 是 5 位数 请问十进制整数 2022 在二进制中是几位数 incl
  • PHP导出excel文件的几种方式

    先说说动态生成的内容当作文件来下载的方法 1 通过把Content Type设置为application octet stream 可以把动态生成的内容当作文件来下载 content type内容设置可以参看 http www ostool
  • 父类对象的属性直接赋值给子类对象(使用copyProperties中的方法copyProperties)

    BeanUtils copyProperties 是 Apache Commons BeanUtils 包中提供的一个方法 用于将一个 JavaBean 对象的属性值赋值到另一个 JavaBean 对象中 该方法可以简化 JavaBean
  • springmvc @ResponseBody参数解析核心代码分析 -8

    org springframework web servlet mvc method annotation RequestResponseBodyMethodProcessor supportsParameter 只要参数上有 Reques
  • BAPI_ACC_DOCUMENT_POST用法

    文章目录 1 Overall 2 Code 1 Overall The blog will demostrate how to use BAPI ACC DOCUMENT POST We use enhancement for it 2 C
  • 所有子集 剑指 Offer II 079

    我只是喜欢敲代码 目录 题目描述 AC代码 思路分析 题目描述 给定一个整数数组 nums 数组中的元素 互不相同 返回该数组所有可能的子集 幂集 解集 不能 包含重复的子集 你可以按 任意顺序 返回解集 示例 1 输入 nums 1 2
  • springboot多数据源配置

    之前在介绍使用JdbcTemplate和Spring data jpa时 都使用了单数据源 在单数据源的情况下 Spring Boot的配置非常简单 只需要在application properties文件中配置连接参数即可 但是往往随着业
  • Angular_构建&部署&多环境

    构建 构建 编译和合并 部署 与服务器整合 ng build 使用命令ng build进行构建 构建完成以后 会在项目中多出一个dist文件夹 部署 在服务器端新建一个文件夹client 将dist文件夹中的文件复制粘贴到cleint文件夹
  • TCP选项之SO_RCVBUF和SO_SNDBUF

    SO RCVBUF SO SNDBUF 先明确一个概念 每个TCP socket在内核中都有一个发送缓冲区和一个接收缓冲区 TCP的全双工的工作模式以及TCP的滑动窗口便是依赖于这两个独立的buffer以及此buffer的填充状态 接收缓冲
  • 03-----生产环境 CPU 占用过高,你如何解决?

    1 top指令 top 找出占用 CPU 最高的进程的 pid 2 查看耗CPU的线程号 方法1 top Hp 进程号 然后按下大写P 在该进程中找到 哪些线程占用的 CPU 最高的线程 记录下 tid 注意下图一个是主线程 其余是子线程
  • sqlalchemy数据库连接池QueuePool异常

    数据库相关错误的解决办法 错误一 数据库连接池超过限制 SqlAlchemy QueuePool limit overflow 造成连接数超过数据库连接池的限制 有两方面的原因 第一个是由于数据库连接池数比较小 因此当连接数稍微增加的时候就
  • IDDPM官方gituhb项目--模型构建

    在完成IDDPM论文学习后 对github上的官方仓库进行学习 通过具体的代码理解算法实现过程中的一些细节 官方仓库代码基于pytorch实现 链接为https github com openai improved diffusion 本笔
  • studyreport

    Vi Java Ant Junit的自学报告 1 vi vim编辑器的使用 1 1 vi vim简介 vi编辑器是Linux和Unix上最基本的文本编辑器 工作在字符模式下 由于不需要图形界面 vi是效率很高的文本编辑器 它可以执行输出 删
  • HTML侧面导航栏

  • 函数的模拟实现

    目录 题一 qsort 练习使用库函数 qsort排序各种类型的数据 模拟实现qsort在不同情形的实现 题二 strlen 模拟实现strlen 优解一 优解二 优解三 题三 strcpy 模拟实现strcpy 优解一 题四 strcmp
  • 使用Qt开发绘制多个设备的流量曲线图(附带项目图)

    一 说明 在实际项目中 主要是使用Qt开发CS程序 当然主要是客户端 公司项目中有这个需求是实时显示多个设备的流量曲线图 设备将流量信息发给服务端 服务端再将信息通过Socket发给Qt客户端 Qt客户端通过Socket接收后实时显示在程序
  • pip安装pytorch

    问题简述 直接pip install pytorch 报错 解决办法 1 登陆https pytorch org get started locally 2 选择对应的条件 最后会生成command 3 将command中的代码copy到命
  • Netty实战(七)EventLoop和线程模型

    EventLoop和线程模型 一 什么是线程模型 二 EventLoop 接口 2 14 Netty 4 中的 I O 和事件处理 三 任务调度 3 1 JDK 的任务调度 API 3 2 使用 EventLoop 调度任务 四 实现细节