Netty 学习笔记(4) ------ EventLoopGroup

EventLoopGroup负责管理Channel的事件处理任务,继承自java.util.concurrent包下的Executor,所以其结构类似与线程池,管理多个EventLoop。
而一个EventLoop将由一个永远不会改变的Thread驱动,同时任务(Runnable或者Callable)可以直接提交给EventLoop实现。
另外,一个EventLoop可能会被指派用于服务多个Channel,Channel对应的I/O事件(或者说它绑定的ChannelHandler处理器)都由该EventLoop的Thread进行处理。

EventLoop分配

异步传输(NIOEventloopGroup)


EventLoopGroup负责为每个新创建的Channel分配一个EventLoop,目前使用轮询算法分配。一个EventLoop可以被分配给多个Channel。
一个Channel的生命周期都使用相同的EventLoop处理事件,这意味着在只涉及一个Channel状态变化的处理不用担心其线程安全问题。但是对于ThreaLocal要考虑多Channel共享问题。

同步传输(OIOEventLoopGroup)


同步传输与异步传输的区别在于一个EventLoop只能分配给一个Channel。

EventLoop处理任务流程


如果当前线程是EventLoop的线程,那么任务将被直接执行;如果不是,任务将会进入EventLoop的内部队列(每个EventLoop都有自己的队列,不同与线程池)。
由于Channel的事件都由特定的线程处理,所以长时间的任务或者阻塞任务不要放入EventLoop中处理,不然会阻塞该EventLoop上其他的任务。Netty的作者建议是使用一个专门的Executor处理。

参考资料

Netty in action

猜你喜欢

转载自www.cnblogs.com/wuweishuo/p/10993843.html