EventLoopGroup与Reactor
浅谈 Reactor 线程模型
单线程模型

问题:当handler1阻塞时,则整个都阻塞了
多线程模型

问题:当客户端线程过多时或需要在客户端连接时做一些验证
主从多线程模型

EventLoopGroup 与 Reactor 关联
不同的设置 NioEventLoopGroup 的方式就对应了不同的 Reactor 的线程模型。
单线程
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
ServerBootstrap server = new ServerBootstrap();
server.group(bossGroup);
若只有一个则主从共用一个线程池
public ServerBootstrap group(EventLoopGroup group) {
return group(group, group);
}
多线程
EventLoopGroup bossGroup = new NioEventLoopGroup(128);
ServerBootstrap server = new ServerBootstrap();
server.group(bossGroup);
主从多线程
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup);
EventLoopGroup 的实例化
类图

EventLoopGroup:Special {@link EventExecutorGroup} which allows registering {@link Channel}s that get processed for later selection during the event loop.
Iterable:Implementing this interface allows an object to be the target of the "for-each loop" statement.
流程图

1 NioEventLoopGroup本质是EventExecutor[] children的数组
2 若不指定线程数,则默认是cpu核数 * 2
任务执行者 EventLoop
类图

NioEventLoop:与channel相关的操作
SingleThreadEventLoop:单线程执行任务
SingleThreadEventExecutor:对本地线程的抽象,属性中含有Thread属性;任务队列
AbstractScheduledEventExecutor:定时执行某个任务
NioEventLoop 的实例化过程

EventLoop与Channel 的关联
在 Netty 中, 每个 Channel 都有且仅有一个 EventLoop 与之关联。
io.netty.channel.AbstractChannel.AbstractUnsafe#register的AbstractChannel.this.eventLoop = eventLoop;来实现关联

EventLoop 的启动
NioEventLoop 本身就是一个 SingleThreadEventExecutor,因此 NioEventLoop 的启动,其 实就是 NioEventLoop 所绑定的本地 Java 线程的启动,具体时序图见上图。
网友评论