1. 程式人生 > >Netty原始碼解析 -- 事件迴圈機制實現原理

Netty原始碼解析 -- 事件迴圈機制實現原理

本文主要分享Netty中事件迴圈機制的實現。 **原始碼分析基於Netty 4.1** ### EventLoop 前面分享服務端和客戶端啟動過程的文章中說過,Netty通過事件迴圈機制(EventLoop)處理IO事件和非同步任務,簡單來說,就是通過一個死迴圈,不斷處理當前已發生的IO事件和待處理的非同步任務。示例如下 ``` while(true) { process(selector.select()); process(getTask()); } ``` 這種事件迴圈機制也是一種常用的IO事件處理機制,包括Redis,Mysql都使用了類似的機制。 關於非同步任務,前面文章說過,EventLoop實現了(jvm)Executor的介面,execute方法可以提供非同步任務。 register,bind,connect等操作,都會提交一個任務給EventLoop處理。如 ``` if (eventLoop.inEventLoop()) { register0(promise); } else { eventLoop.execute(new Runnable() { public void run() { register0(promise); } }); } ``` 下面看一下Netty中事件迴圈機制相關的類。 EventExecutor,事件執行器,負責處理事件。 EventExecutorGroup維護了一個EventExecutor連結串列,它繼承了ScheduledExecutorService,execute方法通過next方法選擇一個EventExecutor,並呼叫EventLoop#execute處理事件。 (EventExecutor繼承了EventExecutorGroup,可以看做一個特殊的EventExecutorGroup,其execute方法可以提交一個任務任務) EventLoop,事件迴圈器,繼承了EventExecutor,通過迴圈不斷處理註冊於其上的Channel的IO事件。 EventLoopGroup介面則繼承了EventExecutorGroup,負責排程EventLoop。 SingleThreadEventExecutor實現了EventExecutor,它會建立一個新執行緒,並在該執行緒上處理事件,可以理解為單執行緒處理器。 MultithreadEventExecutorGroup實現EventExecutorGroup,可以理解為多執行緒處理器(實際上是維護了多個EventExecutor,一個EventExecutor可以理解為一個執行緒),newChild方法構造具體的EventExecutor。 MultithreadEventExecutorGroup可以配置EventExecutor數量,即執行緒數量。 EventExecutorChooserFactory.EventExecutorChooser負責選擇一個EventExecutor執行實際操作。 NioEventLoop繼承了SingleThreadEventExecutor,負責處理NIO事件。所以,一個NioEventLoop物件可以看做是一個執行緒。 NioEventLoop也實現了EventLoop介面,它實現了事件迴圈機制,是Netty核心類。 MultithreadEventLoopGroup繼承了MultithreadEventExecutorGroup,並實現了EventLoopGroup,其newChild方法構造具體的EventLoop。 NioEventLoopGroup#newChild會構建NioEventLoop。 EventLoop各實現類關係如下 ![](https://upload-images.jianshu.io/upload_images/3804367-cf707d07bbe510ae.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) #### 啟動 SingleThreadEventExecutor關鍵欄位 ``` private fin