netty原始碼解解析(4.0)-6 執行緒模型-IO執行緒EventLoopGroup和NIO實現(一)
阿新 • • 發佈:2018-12-11
介面定義
io.netty.channel.EventLoopGroup extends EventExecutorGroup
io.netty.channel.EventLoop extends OrderedEventExecutor, EventLoopGroup
EventLoopGroup定義的主要方法是register, 這個方法的語義是把channel和eventLoop繫結在一起。一個channel對應一個eventLoop, 一個eventLoop會持有多個channel。
I/O執行緒EventLoopGroup的抽象實現
io.netty.channel.MultithreadEventLoopGroup extends MultithreadEventExecutorGroup implements EventLoopGroup
io.netty.channel.SingleThreadEventLoop extends SingleThreadEventExecutor implements EventLoop
兩個類主功能都是實現了EventLoopGroup定義的register方法
MultithreadEventLoopGroup
public ChannelFuture register(Channel channel) {
return next().register(channel);
}
public ChannelFuture register(Channel channel, ChannelPromise promise) {
return next().register(channel, promise);
}
SingleThreadEventLoop
public ChannelFuture register(Channel channel) {
return register(channel, new DefaultChannelPromise(channel, this));
}
public ChannelFuture register(final Channel channel, final ChannelPromise promise) {
channel.unsafe().register(this, promise);
return promise;
}
register的實現主要是為了呼叫Channel.Unsafe例項的register方法。
NIO實現
io.netty.channel.nio.NioEventLoopGroup extends MultithreadEventLoopGroup
io.netty.channel.nio.NioEventLoop extends SingleThreadEventLoop
NioEventLoopGroup是在MultithreadEventLoopGroup基礎上實現了對JDK NIO Selector的封裝, 它實現以下幾個功能:
- 建立selector
- 在selector上註冊channel感興趣的NIO事件
- 實現EventExecutor的run方法,定義NIO事件和Executor任務的處理流程。
- 把NIO事件轉換成對channel unsafe的呼叫或NioTask的呼叫
- 控制執行緒執行I/O操作和排隊任務的用時比例
- 處理epoll selector cpu 100%的bug