Netty学习系列-EventLoop

Posted 程序Caribbean

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Netty学习系列-EventLoop相关的知识,希望对你有一定的参考价值。

前言

       这篇文章是Netty学习系列的第三篇文章,从上面一篇文章我们了解到NioEventLoop是Netty处理事件的核心机制。具体的我将本篇文章分为四个大的方面,NioEventLoop创建NioEventLoop启动NioEventLoop执行逻辑NioEventLoop的总结

一 NioEventLoop的创建

       在创建NioEventLoop时首先会创建一个线程执行器,这个线程执行器的作用就是创建一个NioEventLoop对应底层的一个线程,然后会用一个for循环创建一个EventLoop数组,然后再创建每一个EventLoop的时候时调用一个 newChild() 方法,给NioEventLoop配置属性,在最后会创建一个选择器给每个新连接分配一个 NioEventLoop,具体的相关函数调用可以看下图:

       

 还记得我们在第一篇文章的例子程序中服务端启动的时候,传入了两个EventLoopGroup如下:

	EventLoopGroup bossGroup = new NioEventLoopGroup(1);
EventLoopGroup workerGroup = new NioEventLoopGroup();

       由上面的代码可知,我们是在这里创建的NioEventLoop,我们跟进去看看他的构造函数,源码如下:

/**
* NioEventLoopGroup.java 36行起
*/

public class NioEventLoopGroup extends MultithreadEventLoopGroup {

/**
* Create a new instance using the default number of threads, the default {@link ThreadFactory} and
* the {@link SelectorProvider} which is returned by {@link SelectorProvider#provider()}.
*/

public NioEventLoopGroup() {
this(0);
}

/**
* Create a new instance using the specified number of threads, {@link ThreadFactory} and the
* {@link SelectorProvider} which is returned by {@link SelectorProvider#provider()}.
*/

public NioEventLoopGroup(int nThreads) {
this(nThreads, (Executor) null);
}
......
}

       可以从这里知道,无参构造函数会自动给我们设置一个0,而去调用有参够着函数,这里我们继续跟下去看看他们的内部逻辑到底是怎样创建的,其实到最后他会调用到父类MultithreadEventLoopGroup的构造函数,具体源码如下:

以上是关于Netty学习系列-EventLoop的主要内容,如果未能解决你的问题,请参考以下文章

Netty入门学习

Netty入门学习

netty系列之:channel和channelGroup

Netty基础招式——ChannelHandler的最佳实践

Netty的EventLoop和线程模型

Netty实战七之EventLoop和线程模型