以主从Reactor为例,Server在启动的时候,会创建Boss和Worker两个EventLoopGroup,这两个group会作为参数传入到ServerBootstrap的group方法中。
1.Boss组线程的启动:
1) 用户线程部分:
AbsttractBootstrap.bind->绑定端口
AbsttractBootstrap.initAndRegister->初始化channel并注册channel
MultithreadEventLoopGroup.register
SingleThreadEventLoop.register
AbstractChannel.register
SingleThreadEventExecutor.execute
SingleThreadEventExecutor.startThread->这个只会在初始化的时候start一次,因为inEventLoop是false。
SingleThreadEventExecutor.doStartThread
ThreadPerTaskExecutor.execute->4.1.X新加入的方法,将用工厂创建线程并启动执行任务的动作封装了起来,也是真正启动Boss线程的地方,之前都是用户线程。
2) Boss线程部分:
SingleThreadEventExecutor.this.run
NioEventLoop.run->这里是一个死循环,在ratio不是100的时候,会一直跑任务,主要工作有两个:
NioEventLoop.processSelectedKeys 和 SingleThreadEventExecutor.runAllTasks。
下面先说下SingleThreadEventExecutor.runAllTasks。
3) Boss线程组创建并启动的线程数量
无论你在构造EventLoopGroup的时候的入参传入的nThreads是多少,真正创建并启动的Boss线程的个数只和bind的端口数有关。如果server只绑定了一个端口(大部分服务器都是只绑定一个端口),那么及时nThreads>1,那么也只会启动一个Boss线程。
因为这个线程的启动是bind动作的附属操作(bind中的register0),所以和bind的次数相关。