Netty 框架学习 —— EventLoop 和线程模型
EventLoop 接口
Netty 是基于 Java NIO 的,因此 Channel 也有其生命周期,处理一个连接在其生命周期内发生的事件是所有网络框架的基本功能。通常来说,我们使用一个线程来处理一个连接,该连接的生命周期的某一事件就绪,则会调用对应的事件处理逻辑
在 Netty 中,一个 EventLoop 负责处理一个 Channel 的生命周期事件。在代码设计上,EventLoop 间接实现了 JUC 中的 ExecutorService 和 ScheduleExecutorService 两个接口,因此其具有了线程池的特性。一个 EventLoop 将由一个永远不会改变的 Thread 驱动,EventLoop 由一个 Selector 和 TaskQueue 组成,Selector 会选择 Channel 生命周期中某一事件,并由 EventLoop 所在的线程选择对应的 ChannelHandler 进行处理。除此之外,用户还可以手动提交任务给 EventLoop,以立即执行或调度执行
任务调度
有时候,你希望在 Channel 中调度一个任务以立即执行、稍后执行或者周期性执行。然而,这些任务有可能会造成长时间的阻塞,如果写在 ChannelHandler 里面,则有可能会阻塞整个执行链。因此,我们可以把这些任务提交给 EventLoop,EventLoop 会把这些任务放入 TaskQueue 中,等待创建线程去执行,这个过程是异步非阻塞的,不会影响到主执行链
Channel ch = ...;
ScheduleFuture<?> future = ch.eventLoop().schedule(
// 创建一个 Runnable 以供调度稍后执行
new Runnable() {
@Override
public void run() {
// 要执行的代码
System.out.println("60 second later");
}
}, 60, TimeUnit.SECONDS);
由此我们知道,EventLoop 所在线程负责一个 Channel 的整个生命周期内的所有事件。有时候,我们还会在别的线程去获取一个 Channel,并向该 Channel 对应的 EventLoop 提交任务。这种非对应 Channel 所提交过来的任务,EventLoop 会把它放入任务队列中,等待下次执行
EventLoop 的线程分配
服务于 Channel 的 EventLoop 包含在 EventLoopGroup 中,根据不同的传输实现,EventLoop 的创建和分配方式也不同
1. 异步传输
异步传输实现只使用了少量的 EventLoop,一个 EventLoop 可能会被多个 Channel 所共享,通过尽可能少的线程来支撑大量的 Channel,而不是每个 Channel 分配一个 Thread
需要注意的是,一个 EventLoop 被用于支撑多个 Channel,那么对于所有相关联的 Channel 来说,ThreadLocal 是一样的,这使得它对于实现状态追踪等功能来说是个糟糕的选择
2. 阻塞传输
每一个 Channel 都将分配给一个 EventLoop,每个 Channel 的 IO 事件都将只会被一个 Thread 处理
Netty 框架学习 —— EventLoop 和线程模型的更多相关文章
- Netty中的EventLoop和线程模型
一.前言 在学习了ChannelHandler和ChannelPipeline的有关细节后,接着学习Netty的EventLoop和线程模型. 二.EventLoop和线程模型 2.1. 线程模型 线 ...
- Netty学习摘记 —— 再谈EventLoop 和线程模型
本文参考 本篇文章是对<Netty In Action>一书第七章"EventLoop和线程模型"的学习摘记,主要内容为线程模型的概述.事件循环的概念和实现.任务调度和 ...
- 【Netty】EventLoop和线程模型
一.前言 在学习了ChannelHandler和ChannelPipeline的有关细节后,接着学习Netty的EventLoop和线程模型. 二.EventLoop和线程模型 2.1. 线程模型 线 ...
- 操作系统学习笔记----进程/线程模型----Coursera课程笔记
操作系统学习笔记----进程/线程模型----Coursera课程笔记 进程/线程模型 0. 概述 0.1 进程模型 多道程序设计 进程的概念.进程控制块 进程状态及转换.进程队列 进程控制----进 ...
- Netty实战七之EventLoop和线程模型
简单地说,线程模型指定了操作系统.编程语言.框架或者应用程序的上下文中的线程管理的关键方面.Netty的线程模型强大但又易用,并且和Netty的一贯宗旨一样,旨在简化你的应用程序代码,同时最大限度地提 ...
- Netty学习三:线程模型
1 Proactor和Reactor Proactor和Reactor是两种经典的多路复用I/O模型,主要用于在高并发.高吞吐量的环境中进行I/O处理. I/O多路复用机制都依赖于一个事件分发器,事件 ...
- JavaSE中线程与并行API框架学习笔记1——线程是什么?
前言:虽然工作了三年,但是几乎没有使用到多线程之类的内容.这其实是工作与学习的矛盾.我们在公司上班,很多时候都只是在处理业务代码,很少接触底层技术. 可是你不可能一辈子都写业务代码,而且跳槽之后新单位 ...
- Dubbo -- 系统学习 笔记 -- 示例 -- 线程模型
Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 线程模型 事件处理线程说明 如果事件处理的逻辑能迅速完成,并且不会发起新的IO请求 ...
- 深入学习redis 的线程模型
一.redis 的线程模型 redis 内部使用文件事件处理器 file event handler,它是单线程的,所以redis才叫做单线程模型.它采用IO多路复用机制同时监听多个 socket,将 ...
随机推荐
- SpringBoot程序后台运行
使用nohup命令让进程后台运行 nohup java -jar 自己的springboot项目.jar >日志文件名.log 2>&1 & >日志文件名.log : ...
- helium的浏览器启动及option配置 - 1
helium的浏览器启动及option配置 前言 helium只支持chrome和firefox两个浏览器,其中option配置是基于selelium来配置的,所以所调用的也是seleium的配置方式 ...
- SwiftUI 简明教程之自定义 Modifier
本文为 Eul 样章,如果您喜欢,请移步 AppStore/Eul 查看更多内容. Eul 是一款 SwiftUI & Combine 教程 App(iOS.macOS),以文章(文字.图片. ...
- Shell $?获取函数返回值或者上一个命令的退出状态
Shell $?获取函数返回值或者上一个命令的退出状态 来自:互联网 时间:2021-01-12 阅读:2 $? 是一个特殊变量,用来获取上一个命令的退出状态,或者上一个函数的返回值. 所谓退出状态, ...
- .jnlp 文件打开方式
.jnlp 文件打开方式 jnlp文件打开需要安装jre ,java环境,通过java环境运行即可,下面介绍详细步骤 1.下载.安装最新版jre环境,直接下一步即可 2 java配置 打开控制面板,查 ...
- 二进制部署K8S-2集群部署
二进制部署K8S-2集群部署 感谢老男孩教育王导的公开视频,文档整理自https://www.yuque.com/duduniao/k8s. 因为在后期运行容器需要有大量的物理硬件资源使用的环境是用的 ...
- commit信息修改
场景:向社区提交commit信息,code reviewer给你回复说,请添加TrivialFix并且完善commit信息.好吧,虽然这对代码的运行无关紧要,但是对于日后的代码管理是很有必要的. 解决 ...
- 11.15 dmidecode:查询系统硬件信息
dmidecode命令可以用来在Linux系统下获取硬件方面的信息.dmidecode遵循SMBIOS/DMI标准,其输出的信息包括BIOS.处理器.内存.缓存等. dmidecode命令的参数选项及 ...
- Linux信号(signal) 机制分析-(转自h13)
[摘要]本文分析了Linux内核对于信号的实现机制和应用层的相关处理.首先介绍了软中断信号的本质及信号的两种不同分类方法尤其是不可靠信号的原理.接着分析了内核对于信号的处理流程包括信号的触发/注册/执 ...
- Centos6.9以下查看端口占用情况和开启端口命令
Centos查看端口占用情况命令,比如查看80端口占用情况使用如下命令: lsof -i tcp:80 列出所有端口 netstat -ntlp 1.开启端口(以80端口为例) ...