EvnetLoop 是一个接口,是Netty 框架中组件之一,主要作用是将Channel
注册到本身,然后处理Channel
的I/O操作。
关于Channel 的相关概念,请移步这里。
图一:EventLoop通过图1我们发现EventLoop 本身非常的简单,只有一个parent
函数,大部分的函数都在EventExecutorGroup
接口中,而EventExecutorGroup
的大部分接口也仅仅是重写了父接口函数的返回值类型,EventExecutorGroup
父接口都是Java API 的接口。如果你了解这些Java API接口,你就会发现EventLoop
的主要函数如下:
- ChannelFuture register(Channel)
- EventLoopGroup parent()
- EventExcutor next()
JavaDoc 描述
Will handle all the I/O operations for a Channel
once registered. One EventLoop
instance will usually handle more than one Channel
but this may depend on implementation details and internals.
JavaDoc 翻译
当Channel
注册到一个EventLoop
,将会处理通道所有的I/O操作。一个EventLoop实例通常将处理多个Channel
,但这可能取决于实现细节和内部。
一个EventLoop 实现类的例子
final NioDatagramChannel channel = new NioDatagramChannel();
NioEventLoopGroup group = new NioEventLoopGroup();
group.register(channel); //将Channel 注册到EventLoop
channel.pipeline().addLast(new SimpleChannelInboundHandler<io.netty.channel.socket.DatagramPacket>() {
protected void channelRead0(ChannelHandlerContext ctx, io.netty.channel.socket.DatagramPacket msg) throws Exception {
System.out.println(ByteBufUtil.hexDump(msg.content()));
}
});
channel.bind(new InetSocketAddress(8887)).sync().channel().closeFuture().sync();
通过上面的例子,可以发现EventLoop
只使用一个register
函数,这也是EventLoop
的主要功能,一旦将Channel
注册到EventLoop
中,当Channel
拥有I/O
操作的时候,EventLoop
将会被调用。
当调用register
被调用的时候,将会创建一个线程调用,这个线程会循环获取Channel
中是否有I/O操作,当拥有I/O操作的时候,将会调用Channel
的ChannelPipeline
中的ChannelHandler
。
网友评论