Netty笔记一: NioEventLoopGroup介绍

NioEventLoopGroup介绍


1. NioEventLoopGroup从名字就可以看出它是NioEventLoop的一个集合, 它里面包含一些NioEventLoop.

2. NioEventLoopGroup里有一个名为children的数组用来保存NioEventLoop, 它还有个名为next的方法用来从NioEventLoop数组中依次返回NioEventLoop.


NioEventLoopGroup代码分析


1. 类继承结构

先不看接口的实现, 这样会比较简单, 还有就是接口中的方法最终还是会在类中实现.

Netty笔记一: NioEventLoopGroup介绍_第1张图片

NioEventLoopGroup类的继承比较简单, 主要的代码在NioEventLoopGroup和MultithreadEventExecutorGroup中.


2. 构造方法

NioEventLoopGroup()无参构造方法最后调用下面这个有参构造方法

public NioEventLoopGroup(int nThreads, Executor executor, final SelectorProvider selectorProvider) {

super(nThreads, executor, selectorProvider);

}

参数nThreads是NioEventLoopGroup中NioEventLoop数量, 参数executor是一个实现了Executor的线程工厂, 参数selectorProvider是Java Nio Selecter的提供者.


然后再调用父类MultithreadEventLoopGroup的构造方法

protected MultithreadEventLoopGroup(int nThreads, Executor executor, Object... args) {

super(nThreads == 0 ? DEFAULT_EVENT_LOOP_THREADS : nThreads, executor, args);

}

如果nThreads 等于0, NioEventLoop数量为机器cpu线程数的两倍.


然后调用父类MultithreadEventExecutorGroup的构造方法

protected MultithreadEventExecutorGroup(int nThreads, Executor executor, Object... args) {

if (nThreads <= 0) {

throw new IllegalArgumentException(String.format("nThreads: %d (expected: > 0)", nThreads));

}

if (executor == null) {

executor = new ThreadPerTaskExecutor(newDefaultThreadFactory());

}

children = new EventExecutor[nThreads];

......

}

这里创建NioEventLoop数组, 并创建数组中NioEventLoop对象.


3. 一些重要的方法

next()方法

它实现在MultithreadEventExecutorGroup中

public EventExecutor next() {

return children[Math.abs(childIndex.getAndIncrement() % children.length)];

}

它能依次从NioEventLoop数组中取出NioEventLoop.


submit(), schedule()方法

它们实现在AbstractEventExecutorGroup中

public Future submit(Runnable task) {

return next().submit(task);

}

类线程池的submit功能, 它从NioEventLoop数组中取出一个NioEventLoop, 然后调用NioEventLoop的submit方法.

schedule方法也是一样.



你可能感兴趣的:(Netty)