NioEventLoopGroup与Executor
EventLoop
- 事件循环机制的基本原理是,程序通过一个循环不断地等待事件发生,当事件发生时,立即调用相应的处理函数进行处理。事件循环机制的核心是事件循环(Event Loop),它负责监听事件、调用回调函数、处理事件等操作。在事件循环机制中,当一个事件被触发时,会将它放入一个事件队列(Event Queue)中,事件循环会不断地从事件队列中取出事件并处理它们。
- 总之,就是处理任务的。
何谓EventLoop
- EventLoop是一种事件循环机制,主要用于实现基于事件驱动的异步编程模型。在Java中,Netty框架的核心就是EventLoop,它负责管理所有的IO事件,比如连接、读写等操作,并且基于NIO的Selector机制实现了高效的事件分发和处理。
- EventLoop通过不断地轮询IO事件,将已经就绪的IO事件分发给对应的ChannelHandler进行处理。因此,EventLoop实际上是一个事件循环机制,它不断地从就绪的IO事件中选择一个进行处理,直到所有的IO事件都被处理完毕。
- EventLoop通常会被封装在一个线程中运行,它维护了一个任务队列,所有的任务都会被提交到该队列中。EventLoop在运行过程中,会不断地从任务队列中取出任务进行处理,如果任务队列为空,EventLoop会进入休眠状态,等待新的任务被提交。
何谓EventLoopGroup
- EventLoopGroup 是 Netty 中的一个重要组件,它可以看作是 EventLoop 的集合,它的主要作用是管理和分配 EventLoop。它实现了一种负载均衡的策略,可以将连接分配到不同的 EventLoop 上进行处理,从而避免单一的 EventLoop 被过度占用而导致性能瓶颈。
- 同时,EventLoopGroup 还可以在多线程场景下提供一些便利。在使用多线程的情况下,可以将不同的 EventLoop 分配到不同的线程中进行处理,从而实现更高效的并发处理能力。
组合模式
可以发现,EventLoop是EventLoopGroup的子类,而EventLoop又是EventLoopGroup的成员变量。
- 组合模式是一种结构型模式,它将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得客户端可以以一致的方式处理单个对象以及对象组合。
- 经典的就是文件系统了,文件夹中包含文件和文件夹,这就会形成一种树结构。
- 在Netty中,EventLoop看成是文件,那EventLoopGroup是文件夹,又因为EventLoop是Group的子类,那它也可以是文件夹。
EventLoopGroup的实现类
NioEventLoopGroup
- 实例化时,会调用父类的构造方法。
- 主要是初始化的成员变量
- EventLoop接口继承EventLoopGroup,EventLoopGroup继承自EventExecutor接口,也就是说,EventLoop本质上也是一个EventExecutor。
- 最好在实例化时指定线程数
-
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
-
Executor接口
- 线程池和Netty的EventLoopGroup的老父亲都是它。
- 就是个执行任务的组件。
- NioEventLoopGroup类关系图如下:
理解Executor
阅读它的注释即可,就是一些常见的实现方式。
线程工厂
- 线程就是执行任务的最终对象,所以需要创建线程,为了将创建线程单独封装,遂需要线程工厂。
- 线程工厂的设计初衷是为了提供一种可定制的方式来创建线程,控制线程的创建方式、线程的名称、线程的优先级等属性。
- 将创建线程单独封装,隐藏new Thread()这个动作。
- 它将创建新线程的逻辑从线程的调用方中分离出来,提高了代码的可维护性和可扩展性。
NioEventLoopGroup默认的Executor
- ThreadPerTaskExecutor
- 命令模式:
- 这段代码中的
execute()
方法实际上使用了命令模式。它接收一个Runnable
对象作为参数,并将其封装在一个新线程中执行。这里的Runnable
对象就扮演了一个命令的角色。
- 这段代码中的
- 委托模式:
- ThreadPerTaskExecutor将任务的执行委托给了ThreadFactory对象。
小结
- 实例化NioEventLoopGroup对象,只是为netty的工作做一些准备,比如准备好执行器。
- 此时并没有线程的创建。
转载自:https://juejin.cn/post/7227435228687728695