EventLoopGroup
是一组
EventLoop
的抽象,
Netty
为了更好的利用多核
CPU
资源,一般会有多
个
EventLoop
同时工作,每个
EventLoop
维护着一个
Selector
实例。
一. 线程组创建源码流程分析
线程组创建流程分析:
1. 创建线程组EventLoopGroup
2. 根据创建EventLoopGroup 线程组时设置的参数决定在线程组内创建线程的个数,如未写参数,则默认创建的线程为当前主机CPU线程数*2,在实际案例中,一般bossGroup线程组会人为设置参数为创建1个线程,而workGroup一般选择默认线程数。
3. 根据配置的线程数循环,初始化每个线程NioEventLoop,以及创建与线程配套的任务队列TaskQueue及选择器select。
二. 线程组创建主要源码跟踪
(一)NioEventLoopGroup线程组的创建
/**
* Abstract base class for {@link EventLoopGroup} implementations that handles their tasks with multiple threads at
* the same time.
*/
public abstract class MultithreadEventLoopGroup extends MultithreadEventExecutorGroup implements EventLoopGroup {
private static final InternalLogger logger = InternalLoggerFactory.getInstance(MultithreadEventLoopGroup.class);
private static final int DEFAULT_EVENT_LOOP_THREADS;
static {
//默认线程数量为处理器数*2
DEFAULT_EVENT_LOOP_THREADS = Math.max(1, SystemPropertyUtil.getInt(
"io.netty.eventLoopThreads", NettyRuntime.availableProcessors() * 2));
if (logger.isDebugEnabled()) {
logger.debug("-Dio.netty.eventLoopThreads: {}", DEFAULT_EVENT_LOOP_THREADS);
}
}
/**
* @see MultithreadEventExecutorGroup#MultithreadEventExecutorGroup(int, Executor, Object...)
* 判断nThreads是否等于0,如果等于0取24,如果不等于0,则取传入进来的nThreads线程值
*/
protected MultithreadEventLoopGroup(int nThreads, Executor executor, Object... args) {
super(nThreads == 0 ? DEFAULT_EVENT_LOOP_THREADS : nThreads, executor, args);
}
/**
* @see MultithreadEventExecutorGroup#MultithreadEventExecutorGroup(int, ThreadFactory, Object...)
*/
protected MultithreadEventLoopGroup(int nThreads, ThreadFactory threadFactory, Object... args) {
super(nThreads == 0 ? DEFAULT_EVENT_LOOP_THREADS : nThreads, threadFactory, args);
}
/**
* @see MultithreadEventExecutorGroup#MultithreadEventExecutorGroup(int, Executor,
* EventExecutorChooserFactory, Object...)
*/
protected MultithreadEventLoopGroup(int nThreads, Executor executor, EventExecutorChooserFactory chooserFactory,
Object... args) {
super(nThreads == 0 ? DEFAULT_EVENT_LOOP_THREADS : nThreads, executor, chooserFactory, args);
}
}
(二)NioEventLoop的创建