您能解释一下Netty如何使用线程池工作吗?我是否理解正确,有两种线程池:老板和工人。 Boss用于执行I / O和worker用于调用用户回调(messageReceived)来处理数据?
答案 0 :(得分:30)
这是来自NioServerSocketChannelFactory文档
一个ServerSocketChannelFactory 创建一个基于服务器端的NIO ServerSocketChannel实例。它利用了 非阻塞I / O模式 与NIO合作为很多人服务 并发连接数 有效率的。
线程如何工作
有两种类型 的线程 NioServerSocketChannelFactory;一个是 老板线程,另一个是工人 线。Boss线程
每个约束 ServerSocketChannel有自己的老板 线。例如,如果你打开了两个 服务器端口,如80和443,你 将有两个老板线程。老板 线程接受传入的连接 直到端口未绑定。一旦 连接已成功接受, 老板的线程通过了接受 通道到其中一个工作线程 那个NioServerSocketChannelFactory 管理。工人线程
一 NioServerSocketChannelFactory可以有 一个或多个工作线程。一位工人 线程执行非阻塞读取和 为一个或多个频道写一个 非阻塞模式。
在Nio模型中,bossThread小心所有有界套接字(listen socket),workerThread小心Accepted-socket(包含IO和callReceived等调用事件方法)。
答案 1 :(得分:14)
与Netty Nio实现(3.2.4.Final)NioServerSocketChannelFactory相关的描述。
工作线程池必须至少能够提供工作线程数(目前默认2 *核心数)。
为什么?
在这种实现的情况下,每个工作者都有自己的选择器循环,这意味着每个工作人员将“吃掉”一个线程在选择器上休眠。此工作者(和相关联的线程)负责执行所有实际的写入和读取(包括管道上的触发事件,这意味着处理程序在该工作线程中执行)。
如果是boss 线程池,实际上线程池是不需要的,因为当前实现只从中获取一个线程。在接受连接向工作者注册的连接之后,该线程大部分时间都在服务器套接字的选择器上休眠。从那一刻起,工人就负责提供这种联系。