美文网首页
EventLoopGroup的分析

EventLoopGroup的分析

作者: 剑道_7ffc | 来源:发表于2020-04-02 08:06 被阅读0次

EventLoopGroup与Reactor

浅谈 Reactor 线程模型

单线程模型
image.png

问题:当handler1阻塞时,则整个都阻塞了

多线程模型
image.png

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

主从多线程模型
image.png

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 的实例化

类图
image.png

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.

流程图
EventLoopGroup 的实例化.png

1 NioEventLoopGroup本质是EventExecutor[] children的数组
2 若不指定线程数,则默认是cpu核数 * 2

任务执行者 EventLoop

类图

image.png

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

NioEventLoop 的实例化过程

NioEventLoop 的实例化过程.png

EventLoop与Channel 的关联

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


EventLoop与Channel 的关联.png

EventLoop 的启动

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

相关文章

网友评论

      本文标题:EventLoopGroup的分析

      本文链接:https://www.haomeiwen.com/subject/xujtphtx.html