版权声明:士,不可以不弘毅,任重而道远 https://blog.csdn.net/superbeyone/article/details/85679641
Netty之EventLoop,EventLoopGroup,Channel
- 一個
EventLoopGroup
當中會包含一個或多個EventLoop
. - 一個
EventLoop
在它的整個生命週期當中都只會與唯一一個Thread進行綁定. - 所有由
EventLoop
所處理的各種I/O事件都將在它所關聯的那個Thread上進行處理. - 一個
Channel
在它的整個生命週期中只會註冊在一個EventLoop
上. - 一個
EventLoop
在運行過程當中,會被分配給一個或者多個Channel
.
重要結論:
- 在Netty中,
Channel
的實現一定是線程安全的;基於此,我們可以存儲一個Channel
的引用,並且在需要向遠程端點發送數據時,通過這個引用來調用Channel
相應的方法;即便當時有很多線程都在使用它也不會出現線程問題;而且,消息一定會按照順序發送出去。 - 我們在業務開發中,不要將長時間執行的耗時任務放入到
EventLoop
的執行隊列中,因爲它將會一直阻塞該線程所對應的所有Channel
上的其他執行任務,如果我們需要進行阻塞調用或是耗時的操作(實際開發中很常見),那麼我們就需要使用一個專門的EventExecutor
(業務線程池)。
通常會有兩種實現方式:
- 在
ChannelHandler
的回調方法中,使用自己定義的業務線程池,這樣就可以實現異步調用。 - 藉助於Netty提供的向
ChannelPipeline
添加ChannelHandler
時調用的addLast
方法來傳遞EventExecutor
。
說明:
默認情況下(調用addLast(handler)
),ChannelHandler
中回調方法都是由I/O線程所執行,如果調用了ChannelPipeline addLast(EventExecutorGroup group, ChannelHandler... handlers);
方法,那麼ChannelHandler
中的回調方法就是由參數中的group
線程組來執行的。