Netty如何使用线程池?

Vla*_*sny 35 java netty

你能解释一下Netty如何使用线程池工作吗?我是否理解正确,有两种线程池:老板和工人.老板用来做I/O而工人用来调用用户回调(messageReceived)来处理数据?

sec*_*ask 31

这是来自NioServerSocketChannelFactory的文档

ServerSocketChannelFactory,用于创建基于服务器端的基于NIO的ServerSocketChannel.它利用NIO引入的非阻塞I/O模式有效地服务于许多并发连接.

线程如何工作
NioServerSocketChannelFactory中有两种类型的线程; 一个是老板线程,另一个是工作线程.

Boss线程
每个绑定的ServerSocketChannel都有自己的boss线程.例如,如果您打开了两个服务器端口,例如80和443,那么您将拥有两个boss线程.boss端口接受传入连接,直到端口未绑定.成功接受连接后,boss线程将接受的Channel传递给NioServerSocketChannelFactory管理的其中一个工作线程.

工作线程
一个NioServerSocketChannelFactory可以有一个或多个工作线程.工作线程以非阻塞模式对一个或多个通道执行非阻塞读写.

在Nio模型中,bossThread小心所有有界套接字(listen socket),workerThread小心Accepted-socket(包含IO和callReceived等调用事件方法).


Luk*_*cki 15

与Netty Nio实现(3.2.4.Final)NioServerSocketChannelFactory相关的描述.

工作线程池必须至少能够提供Number of Workers线程(当前默认为2*内核数).

为什么?

在这种实现的情况下,每个工作者都有自己的选择器循环,这意味着每个工作人员将"吃掉"一个线程在选择器上休眠.此工作者(和相关联的线程)负责执行所有实际的写入和读取(包括管道上的触发事件,这意味着处理程序在该工作线程中执行).

在boss线程池的情况下,实际上线程池是不需要的,因为当前实现只从它获取单个线程.在接受连接向工作者注册的连接之后,该线程大部分时间都在服务器套接字的选择器上休眠.从那一刻起,工人就负责提供这种联系.