您能否解释Netty如何使用线程池工作?我是否理解正确,有两种线程池:老板和工人。老板用来做I/O并且worker用来调用用户回调(messageReceived)来处理数据?Netty如何使用线程池?
回答
这是从文件NioServerSocketChannelFactory
甲ServerSocketChannelFactory其中 创建一个服务器端基NIO 的ServerSocketChannel。它利用与NIO一起引入的 非阻塞I/O模式为多个并发连接 高效地提供服务。
线程是如何工作的
有两种类型的 NioServerSocketChannelFactory线程 ;一个是 老板线程,另一个是工作线程 。老板线程
每个绑定 的ServerSocketChannel都有自己的老板 线程。例如,如果您打开两个 服务器端口(如80和443),则您的 将具有两个凸台线程。老板 线程接受传入连接 ,直到端口被解除绑定。一旦 连接成功接受,老板线程将接受的 通道传递给NioServerSocketChannelFactory 管理的工作线程之一 。工作线程
一个 NioServerSocketChannelFactory可以有 一个或多个工作线程。一名工作人员 线程执行非阻塞式读取,并在 非阻塞式模式下为一个或多个通道写入 。
在Nio模型中,bossThread处理所有有界的套接字(listen socket),workerThread保管接受套接字(包含IO和call事件方法,如messageReceived)。
与Netty Nio实现(3.2.4.Final)相关的描述NioServerSocketChannelFactory。
工作线程池必须能够交付至少工作者线程数(当前默认2 *内核数)。
为什么?
在这种实现的情况下,每个工人都有自己的选择器循环,这意味着每个工人将“吃掉”一个线程来睡在选择器上。此外,该工作人员(以及相关的线程)负责进行所有实际的写入和读取操作(包括在管道上触发事件,这意味着处理程序在该工作线程中执行)。
在老板线程池的情况下,实际上线程池是不需要的,因为当前实现只从它获取一个线程。该线程大多数时间在服务器套接字的选择器上休眠,在接受连接之后,该连接已注册到worker。从那时起,工人就负责为这种关系提供服务。
- 1. 如何使升压线程池::线程
- 2. 使用线程池
- 3. Netty连接池
- 4. 使用线程池或线程
- 5. 使用多线程的线程池
- 6. 使用线程池的多线程
- 7. HostingEnvironment.QueueBackgroundWorkItem使用ASP.Net线程池或另一个线程池?
- 8. 如何创建线程池?
- 9. 了解Netty对线程的使用
- 10. netty线程分布
- 11. 线程池借用
- 12. 如何处理OpenMP线程池争用
- 13. 使用线程池得到number线程的使用
- 14. 如何在使用线程池时告诉线程何时完成?
- 15. 如何强制Apache Tomcat不重用线程池中的线程?
- 16. 线程池中的线程
- 17. 线程池stucks
- 18. PHP线程池?
- 19. C++线程池
- 20. Servlet线程池
- 21. QThread线程池
- 22. 线程池:DispatchQueue.main.async
- 23. Windows线程池
- 24. 线程池中线程的可用性?
- 25. Netty中的连接池
- 26. Netty线程被阻塞
- 27. 工作线程Netty中
- 28. Netty - Boss线程执行
- 29. 如何使用异步线程调整/分析线程池配置?
- 30. 如何使用Java中每个httprequest的线程池中的线程?
这就是我的理解。但是,在Netty的所有示例中,我都看到使用cachedThreadPool设置老板池。为什么不使用单线程执行程序?有什么特别的理由吗?在这个线程中提出这个问题,而不是一个新的问题,非常重要,因为这个讨论已经提出。 – 2017-03-31 07:45:21