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,将 ...
随机推荐
- Cannot read property 'style' of null
代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8& ...
- HashSet添加操作底层判读(Object类型)
Object类型添加操作判读 第一步:程序首先创建一个Object泛型的Set数组,这里用到了上转型: 第二步:执行object里面的add添加方法,传进的值为"JAVA": 首先 ...
- 2021ArchSummit全球架构师峰会上,大家在聊些什么
大会PPT公开下载链接:https://ppt.infoq.cn/list/assh2021 大会主要情况介绍 2021 ArchSummit全球架构师峰会是该大会正式成立的第十年,是极客邦科技旗下I ...
- python爬虫——拉钩网python岗位信息
之前爬取的网页都是采用"GET"方法,这次爬取"拉勾网"是采取了"POST"的方法.其中,"GET"和"POS ...
- 使用BeanUtils.copyProperties踩坑经历
1. 原始转换 提起对象转换,每个程序员都不陌生,比如项目中经常涉及到的DO.DTO.VO之间的转换,举个例子,假设现在有个OrderDTO,定义如下所示: public class OrderDTO ...
- PSP初体验:求交点
项目 内容 课程:北航2020春软件工程 博客园班级博客 作业:完成一个平面图形求交点的程序,体验PSP的过程 个人项目作业 我在这个课程的目标是 体验软件开发的全流程 这个作业在哪个具体方面帮助我实 ...
- Kubernetes服务pod的健康检测liveness和readiness详解
Kubernetes服务pod的健康检测liveness和readiness详解 接下来给大家讲解下在K8S上,我们如果对我们的业务服务进行健康检测. Health Check.restartPoli ...
- 7.CentOS文件和目录 以及系统与设置命令
CentOS文件和目录 etc------系统中的配置文件 bin------系统预设执行文件的放置目录 sbin------系统预设执行文件的放置目录 usr------系统预设执行文件的放置目录 ...
- 15.Git
1.Git介绍 1.1版本控制(理解) 无论是代码编写,还是文档编写,我们都会遇到对文档内容反复修改的情况 1.2开发中存在的问题(理解) 程序员小明负责的模块就要完成了,就在即将提交发布之前的一瞬间 ...
- zimbra安装三方颁发的证书
步骤1:取得SSL凭证 证书需要取的从根证书每一级的证书 步骤2:合成SSL证书 将中级.根证书合成为一个证书 顺序:按照从后到前合成为一个证书 如,三级 ==>二级 ==> 根 合成后 ...