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 处理

最新文章

  1. Xcode磁盘空间大清理
  2. PHPExcel 导出表格 不知道好不好用
  3. java web 资源地址写法
  4. json \u unicode字符串转化 c++
  5. 关于DevExpress的GridView.VisibleIndex的赋值问题
  6. require.js入门指南(二)
  7. 《Introduction to Algorithm》-chaper30-多项式与快速傅里叶变换
  8. HOWTO: Setup XCode 6.1 to work with OpenCV3 libraries
  9. C++ 一些容易忽略的基本点
  10. UVALive - 4670 Dominating Patterns AC 自动机
  11. CG之refract函数简单实现
  12. 博弈之——SG模板
  13. 6、Spring-Kafka4
  14. SQL-存储过程-010
  15. 步步为营-47-分页显示的SQL语句
  16. golang图片裁剪和缩略图生成
  17. jQuery ajax请求错误返回status 0和错误error的问题
  18. python 遇到的一些坑
  19. scrapy 爬虫怎么写入日志和保存信息
  20. 【F12】Console命令,让js调试更简单

热门文章

  1. 2021/5/11 docker的应用
  2. java面试一日一题:如何判断一个对象是否为垃圾对象
  3. c#操作斑马打印机打印中文
  4. 神奇的不可见空格&lt;200b&gt;导致代码异常
  5. JMeter四种参数化方式
  6. [java] 转型
  7. Linux 部署 iSCSI 服务端
  8. 怎么样在同一个word文件中删除不同节数的页眉
  9. 用JILINK 下载HEX文件
  10. EasyUI_使用datagrid分页 (Day_28)