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 和线程模型的更多相关文章

  1. Netty中的EventLoop和线程模型

    一.前言 在学习了ChannelHandler和ChannelPipeline的有关细节后,接着学习Netty的EventLoop和线程模型. 二.EventLoop和线程模型 2.1. 线程模型 线 ...

  2. Netty学习摘记 —— 再谈EventLoop 和线程模型

    本文参考 本篇文章是对<Netty In Action>一书第七章"EventLoop和线程模型"的学习摘记,主要内容为线程模型的概述.事件循环的概念和实现.任务调度和 ...

  3. 【Netty】EventLoop和线程模型

    一.前言 在学习了ChannelHandler和ChannelPipeline的有关细节后,接着学习Netty的EventLoop和线程模型. 二.EventLoop和线程模型 2.1. 线程模型 线 ...

  4. 操作系统学习笔记----进程/线程模型----Coursera课程笔记

    操作系统学习笔记----进程/线程模型----Coursera课程笔记 进程/线程模型 0. 概述 0.1 进程模型 多道程序设计 进程的概念.进程控制块 进程状态及转换.进程队列 进程控制----进 ...

  5. Netty实战七之EventLoop和线程模型

    简单地说,线程模型指定了操作系统.编程语言.框架或者应用程序的上下文中的线程管理的关键方面.Netty的线程模型强大但又易用,并且和Netty的一贯宗旨一样,旨在简化你的应用程序代码,同时最大限度地提 ...

  6. Netty学习三:线程模型

    1 Proactor和Reactor Proactor和Reactor是两种经典的多路复用I/O模型,主要用于在高并发.高吞吐量的环境中进行I/O处理. I/O多路复用机制都依赖于一个事件分发器,事件 ...

  7. JavaSE中线程与并行API框架学习笔记1——线程是什么?

    前言:虽然工作了三年,但是几乎没有使用到多线程之类的内容.这其实是工作与学习的矛盾.我们在公司上班,很多时候都只是在处理业务代码,很少接触底层技术. 可是你不可能一辈子都写业务代码,而且跳槽之后新单位 ...

  8. Dubbo -- 系统学习 笔记 -- 示例 -- 线程模型

    Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 线程模型 事件处理线程说明 如果事件处理的逻辑能迅速完成,并且不会发起新的IO请求 ...

  9. 深入学习redis 的线程模型

    一.redis 的线程模型 redis 内部使用文件事件处理器 file event handler,它是单线程的,所以redis才叫做单线程模型.它采用IO多路复用机制同时监听多个 socket,将 ...

随机推荐

  1. layui在toolbar使用上传控件在reload后失效的问题解决

    问题描述 ​使用layui中的upload组件来上传文件,将按钮放了表格中的toolbar(头部工具栏中),碰到的问题是:第一次可以实现上传文件,但是第二次再上传文件的时候,点击按钮无效. 解决办法 ...

  2. ERROR Invalid options in vue.config.js: "baseUrl" is not allowed

    vue项目 我的这个版本是 3.10.0 module.exports = { baseUrl: process.env.NODE_ENV === 'production' ? './' : '/' ...

  3. PHP基础-数组

    一.数组的概述 * 1. 数组的本质:管理和操作一组变量,成批处理 * 2. 数组是复合类型 * 3. 数组中可以存储任意长度的数据,也可以存储任意类型的数据 * 4. 数组就可以完成其它语言数据结构 ...

  4. DLL注入技术(输入法注入)

    输入法注入原理 IME输入法实际就是一个dll文件(后缀为ime),此dll文件需要导出必要的接口供系统加载输入法时调用.我们可以在此ime文件的DllMain函数的入口通过调用LoadLibrary ...

  5. 从执行上下文(ES3,ES5)的角度来理解"闭包"

    目录 介绍执行上下文和执行上下文栈概念 执行上下文 执行上下文栈 伪代码模拟分析以下代码中执行上下文栈的行为 代码模拟实现栈的执行过程 通过ES3提出的老概念-理解执行上下文 1.变量对象和活动对象 ...

  6. SpringBoot系列——事件发布与监听

    前言 日常开发中,我们经常会碰到这样的业务场景:用户注册,注册成功后需要发送邮箱.短信提示用户,通常我们都是这样写: /** * 用户注册 */ @GetMapping("/userRegi ...

  7. 基于深度学习的回声消除系统与Pytorch实现

    文章作者:凌逆战 文章代码(pytorch实现):https://github.com/LXP-Never/AEC_DeepModel 文章地址(转载请指明出处):https://www.cnblog ...

  8. centos8.2-2004

    ~]# cat /etc/*leaseCentOS Linux release 8.2.2004 (Core)NAME="CentOS Linux"VERSION="8 ...

  9. tuple必须加上逗号

    tuple支持  空 元组 不加逗号 >>> tup4 = () tuple非空的元组必须加上逗号>>> tup4 = (55,)>>> tup4 ...

  10. ubuntu16.04 通过命令,修改屏幕分辨率

    ubuntu16.04 通过命令,修改屏幕分辨率 l185979505 2016-10-19 08:15:54 20293 收藏 5展开第一次写博客,,,好激动,,首先通过命令: xrandr 查看可 ...