Netty

Netty 4源码分析(一)EventLoop

概述

与Netty 3相比,Netty中一个重要的改变是将Boss / Worker的概念升级为EventLoop。顾名思义EventLoop是一种事件处理机制,通过线程的循环检测(Loop)来处理相应的事件(Event)。

核心概念

首先我们通过一张类图来看一下EventLoop相关的核心概念。

EventLoop

其中主要包含两类继承关系

单线程模型的NioEventLoop

继承自EventLoop、EventExecutor

多线程模型的NioEventLoopGroup

继承自EventLoopGroup、EventExecutorGroup

Group代表多线程,而EventLoop继承自EventLoopGroup,将单线程当作多线程的一种特例。

初始化

了解了EventLoop的概念,接下来我们看一下Netty Server启动时是怎样创建EventLoop的。一个常见的写法如下

我们会分别创建两个NioEventLoopGroup,分别作为boss和worker的线程资源,传递给bootstrap。

实现原理

多线程的EventLoopGroup,实际是由多个单线程的EventLoop构建而成的。在初始化EventLoopGroup的代码中,我们可以看到

对应NioEventLoopGroup中对newChild的实现为

根据线程数量创建了多个NioEventLoop,它是后续实际对事件进行处理逻辑单元。EventLoop从EventLoopGroup继承了一个关键的方法ChannelFuture register(Channel channel);,可以将建立的连接(Channel)注册给EventLoop进行处理。一个EventLoop可以负责多个Channel,而一个Channel只能注册给一个EventLoop,从而保证了Channel只被一个线程处理。

当需要将Channel分配给一组线程构成的EventLoopGroup时,register()的方法会通过next()方法在children中轮询选取一个EventLoop进行注册,最后还是交由EventLoop进行处理。

EventLoop

基类SingleThreadEventExecutor在初始化时创建一个线程,在线程的run()方法中再调用由子类实现的抽象run()方法。以NioEventLoop为例,它将在该run()方法中执行loop的逻辑

在循环中进行IO事件以及taskQueue中任务的处理。

© 2015, 高飞航.cn. 版权所有.

About gaofeihang

开发工程师,本站的作者。欢迎留下您宝贵的意见!

发表评论

电子邮件地址不会被公开。 必填项已用*标注