Netty原始碼解析 -- 事件迴圈機制實現原理
阿新 • • 發佈:2020-11-04
本文主要分享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