Netty中的執行緒處理EventLoop

爬蜥發表於2018-05-15

Netty是用什麼來處理執行緒的?

一般執行緒池化模式為

  • 從池的空閒任務列表中選擇一個Thread,指派它取執行一個已提交的任務
  • 任務完成時,該Thread返回給該列表,使其可以重用

執行任務處理的在程式設計上的構造通常稱作事件迴圈,Netty使用EventLoop來描述。一個EventLoop將由一個永遠不會變的Thread驅動,它可以被指派給多個channel,任務提交給Eventloop之後可以立即執行或者排程執行。任務的執行順序是以先進先出的順序執行。

Netty是用什麼做任務排程的?

jdk在concurrent包中的ScheduledExecutorService來執行排程,它作為執行緒管理的一部分,會有額外的執行緒建立,但是當有大量的任務被緊湊的排程的時候,這有可能成為瓶頸,EventLoop繼承了它,而且任務排程不存在這個問題。

要實現延遲執行,只需呼叫schedule方法即可,要間隔一段時間,每次執行,則呼叫scheduledAtFixedRate,想要取消排程則是通過返回的scheduledFuture呼叫cancel

EventLoop的執行邏輯是怎樣的?

Netty中的執行緒處理EventLoop

獲取當前的執行執行緒之後,判斷是不是分配給eventLoop的執行緒,如果是就直接執行,否則放到佇列裡面稍後執行,這中模式就是Netty執行緒模式的卓越性,不用關心執行緒安全和同步相關問題

非同步傳輸和同步傳輸對eventLoop來講執行緒分配有什麼不同?

非同步傳輸用的是少量的eventloop,以及與之對應分配的Thread,通過一個執行緒來支撐多個channel(以此來實現少量執行緒支撐大量的channel),同步傳輸則是每個channel一個執行緒




相關文章