netty源码解读三(NioEventLoop)

NioEventLoop

初始化EventExecutor类型的数组

数组大小默认为cpu数量的两倍,遍历数组,通过 new NioEventLoop(xxx)往数组中添加元素,NioEventLoop继承了EventExecutor;每次需要线程时,执行chooser的next方法从数组中取出一个线程;
关键代码
打开netty源码,找到example包下的EchoService类,追溯创建boss线程组和worker线程组的代码,最终会找到MultithreadEventExecutorGroup的构造方法,其中有两行关键代码用于初始化boss或者worker线程组:
children = new EventExecutor[nThreads];//初始化数组
children[i] = newChild(executor, args);//遍历children数组,初始化每个元素
newChild中用到了策略模式,该方法根据不同的操作系统,有不同的实现;找到NioEventLoopGroup#newChild方法,该方法中会执行new NioEventLoop(…)并返回该实例(所以EventExecutor数组中的每个元素是NioEventLoop类型),其中会将 ThreadPerTaskExecutor实例作为executor,创建selector并且将selector作为属性保存;后续会将任务提交给executor.execute(…)执行;

NioEventLoop如何能生产线程

NioEventLoop封装了ThreadPerTaskExecutor实例,而ThreadPerTaskExecutor封装了DefaultThreadFactory实例与execute方法,而DefaultThreadFactory中的newThread方法会返回new FastThreadLocalThread,FastThreadLocalThread继承了Thread。所以NioEventLoop中可以生产线程,具有接收任务,执行任务的能力;且是在execute方法中调用newThread方法创建新线程并启动的,即任务来了才会创建线程去执行任务。所以NioEventLoop拿到任务后,执行ThreadPerTaskExecutor#execute方法,新建线程执行任务。这一块用到了命令模式;
ThreadPerTaskExecutor类和ThreadPoolExecutor类都属于juc中Executor接口的实现类,后者我们已经非常熟悉了,其实现了Executor接口的execute方法,该方法已经分析过了,非常熟悉;而前者也实现了execute方法(无非是新建线程,启动线程,但这里的线程是FastThreadLocalThread实例,该线程类时netty中特有的,主要是为了配合netty中的fastThreadLo

你可能感兴趣的:(netty,java,netty)