vlambda博客
学习文章列表

Netty的NioEventLoop和NioEventLoopGroup是什么关系?


本篇文章大概600字,阅读时间大约3分钟


本篇文章是对前面Netty线程图像相关文章的一个重新总结,并修改了一些错误,还是希望用面试题的形式来全面总结Netty的设计思想和使用的细节,本文主要是重点review了Netty的组件NioEventLoopGroupNioEventLoop的关系

Netty的NioEventLoop和NioEventLoopGroup是什么关系?

Netty线程图像,或者说模型,它最核心的部分就是对Reactor模型的实现,对应项目中使用广泛的就是NioEventLoop和NioEventLoopGroup,这是因为我们大部分场景下,都是用的非阻塞模型编码,否则仍然使用阻塞模型,那使用Netty也就没啥意义了。


对Netty线程模型的设置,体现在业务代码里至少要指定一个EventLoopGroup(或者直接指定NioEventLoopGroup,本质一样)。它们的继承关系如下:

Netty的NioEventLoop和NioEventLoopGroup是什么关系?

前面也介绍过,这个NioEventLoopGroup在Netty中扮演着线程池的角色,看图知道Netty线程池扩展了JDK的线程池接口ExecutorService和定时任务线程池接口ScheduledExecutorService。NioEventLoopGroup里可以容纳多个NioEventLoop对象,这些NioEventLoop对象本质就是Java的Thread,代码里体现就是NioEventLoop聚合了Thread对象。


所以,可以认为NioEventLoopGroup是线程池,NioEventLoop就是线程。这样比较好理解


注意:

1、留意命名规范,后缀为Group的,代表Netty封装的线程池,后缀为Executor的,以及为Loop的,代表Netty封装的线程。


2、Netty封装的线程,【封装】的意思是指为JDK的Thread附带了一些业务,比如事件轮询机制等。具体的说,NioEventLoop(EventLoop)和Java线程Thread对应,一般是绑定了一个固定的Thread对象,一个EventLoop的事件循环机制将由一个永远都不会改变的Thread对象(Java线程)驱动,NioEventLoopGroup和线程池对应,EventLoop定义了Netty的核心抽象,用于处理一个连接的生命周期中所发生的所有I/O事件。


END


点亮在看,你最好看

~

阅读原文,获得更多精彩内容