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,将 ...
随机推荐
- 第二章 FreeBSD之开机关机命令
立即关机,但是不关闭电源 # shutdown -h now 立即关机,并且关闭电源 # shutdown -p now 重启命令 # shutdown -r now
- Spring Boot & Cloud 轻量替代框架 Solon 1.3.37 发布
Solon 是一个微型的Java开发框架.强调,克制 + 简洁 + 开放的原则:力求,更小.更快.更自由的体验.支持:RPC.REST API.MVC.Micro service.WebSocket. ...
- Java解析xml文件遇到特殊符号&会出现异常的解决方案
文/朱季谦 在一次Java解析xml文件的开发过程中,使用SAX解析时,出现了这样一个异常信息: Error on line 60 of document : 对实体 "xxx" ...
- (转)elasticsearch连接不到head插件解决方案
(1)elasticsearch-5x下的 config/elasticsearch.yml http.cors.enabled: true http.cors.allow-origin: & ...
- FreeSWITCH的安装与使用
FreeSWITCH
- redis的数据结构、使用场景、持久化方式以及常见面试问题
一.redis中的数据结构 1.字符串(String) SET key value //存入字符串键值对 MSET key value[key value...] //批量存储字符串键值对 SETNX ...
- [Java] HOW2J(Java中级)
异常 定义:导致程序正常流程被中断的事件 异常处理常见手段 try catch:将可能抛出异常的代码放在try的块中,一旦出现异常就跳转到catch的块中处理 throws/throw:不在本模块处理 ...
- lambda,filter,map,reduce
# lambda,filter,map,reduce from functools import reduce print('返回一个迭代器') print((x) for x in range(5) ...
- linux 详解useradd 命令基本用法
linux 详解useradd 命令基本用法 时间:2019-03-24 本文章向大家介绍linux 详解useradd 命令基本用法,主要包括linux 详解useradd 命令基本用法使用实例.应 ...
- Spring AOP 用法浅谈(Day_18)
当你这一天没有在进步,那你就是在退步! [简述] Aspect Oriented Programming :面向切面编程 所谓面向切面编程,是一种通过预编译和运行期动态代理的方式实现在不修改源代码的情 ...