Netty4的线程模型,优化了上一个版本的线程处理出入站事件和任务的问题。下面,我用通俗易懂的例子来讲解一下。
1,首先是两个线程组的对应角色。boss线程组对应工地老板,负责承接建房的活。worker线程组对应管理分配任务的包工头。工地老板和包工头也需要人才市场牵线统一。人才市场会在建房工程启动前梳理二者的关系,如工地老板负责的公司的营业执照(属性),建造能力等以及包工头的施工队的安排。
2,接着包工头把任务分配给响应的A、B、C、...施工队,每个施工队都有专门负责的电工、砖瓦工、吊机工等。每一个施工队都能够从无到有且有序完成N座房子的建设,先购买材料,接着打地基,再是建墙,再是屋顶等。房子的建设离不开砖、瓦、水泥、钢筋、沙子等材料的购买(输入)、使用(输入)、废弃材料的处理(输出)等事务。如果某个房子出现工程事故也需要施工队的处理汇报。
3,如果某一时间,建房的任务很多,多至一个工地老板做不完。这就需要很多个工地老板。这就需要X个工地老板,Y个包工头。他们分别把对应的建房任务完成。(修改NioEventLoopGroup中的线程值)
4,工程启动后(通道打开后channel开启连接后),一车车砖、瓦、水泥、钢筋、沙子等材料源源不断送过来,首先确定该材料属于哪一个施工队的(判断该事件属于哪一个EventLoop),如果现在这个施工队在工作就把该材料给其,在工作的施工队就会将该材料分给某个房子的建设(某个通道的事件处理),如果没有,就把材料堆在某个地方(消息事件队列),等施工队开始工作了,再交与其处理。
工程角色VSNetty中的线程模型组件表如下所示
建房工程角色 | Netty线程模型 |
工地老板 | boss线程组NioEventLoopGroup |
工地老板 | worker线程组NioEventLoopGroup |
人才市场 | 辅助启动类Bootstrap |
A、B、C、... 施工队 |
IO线程EventLoop |
N 座房子 |
多个通信通道channel |
购买材料、 打地基、建墙、建屋顶任务完成 | 责任处理者Channelhandler (有序) |
工程事故 | 抛异常exceptionCaught |
施工队在工作 | 当前的线程在运行,可以处理事件 |