Netty4的NioEventLoopGroup繼承結構很複雜,爲了理解它如何工做,我畫了一張相似UML的圖。可是這張圖也很巨大,因此我作了如下處理:html
首先從EventExecutorGroup開始,EventExecutorGroup是NioEventLoopGroup最上層的接口,再往上就是Java的地盤了:java
從上面的圖能夠看出3點:api
想象一下,EventExecutorGroup就像一個BOSS,每當有活兒的時候,就派一個小弟(EventExecutor)去幹:數組
AbstractEventExecutorGroup抽象類實現了ScheduledExecutorService接口,但大部分實現都只是調用next()拿到一個EventExecutor,而後調用EventExecutor的相應方法,例如submit()方法:promise
[java] view plain copy多線程
從類名來看,MultithreadEventExecutorGroup有並行(多線程)分配小弟去幹活的能力,換句話說,每一個小弟都工做在本身的線程中。從代碼中也能看出這一點:app
[java] view plain copyide
能夠看出,MultithreadEventExecutorGroup的每個小弟都是一個SingleThreadEventExecutor,並且小弟的數量在構造的時候就肯定了,以下圖所示:oop
從MultithreadEventExecutorGroup的next()方法能夠看到,這個BOSS的小弟分配邏輯至關簡單,無非就是輪流使喚:spa
[java] view plain copy
注:這裏調用了Math.abs()方法以防止childIndex溢出
MultithreadEventLoopGroup類實現了EventLoopGroup接口和register()方法:
[java] view plain copy
最後是NioEventLoopGroup,這個BOSS的每個小弟都是一個NioEventLoop。下面是完整的繼承層次結構圖: