首页 > Web开发 > 详细

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

时间:2019-06-09 17:30:13      阅读:132      评论:0      收藏:0      [点我收藏+]

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

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

原文:https://www.cnblogs.com/wuweishuo/p/10993843.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!