您能否解釋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