NioEventLoopGroup介绍
1. NioEventLoopGroup从名字就可以看出它是NioEventLoop的一个集合, 它里面包含一些NioEventLoop.
2. NioEventLoopGroup里有一个名为children的数组用来保存NioEventLoop, 它还有个名为next的方法用来从NioEventLoop数组中返回一个NioEventLoop.
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方法也是一样.