netty5.x源碼分析-EventLoopGroup和EventLoop

EventLoopGroup和EventLoop的建立

EventLoopGroup構造方法參數有兩個一個是線程數一個是executor

  1. 若是不給線程數默認先讀取系統變量io.netty.eventLoopThreads對應的值,若是沒有則取cpu核數*2個
  2. 若是executor不給定則默認使用ForkJoinPool做爲executor,並行數爲上述值

先看一張NioEventLoopGroup繼承圖java

輸入圖片說明

###構造方法路徑linux

NioEventLoopGroup->MultithreadEventLoopGroup->MultithreadEventExecutorGroupcentos

最終使用下面的代碼,非關鍵代碼不一一列舉ide

private MultithreadEventExecutorGroup(int nEventExecutors,
                                          Executor executor,
                                          boolean shutdownExecutor,
                                          Object... args) {
        //1參數校驗
        //2若是executor爲空建立默認的ForkJoinPool
        //建立EventLoop
        children = new EventExecutor[nEventExecutors];

        for (int i = 0; i < nEventExecutors; i ++) {
            boolean success = false;
            try {

                //newChild方法在NioEventLoopGroup中實現,args是SelectorProvider
                children[i] = newChild(executor, args);
                success = true;
            } catch (Exception e) {
              
            } finally {
                
                //3若是不成功關閉全部的
            }
        }
        //4給EventLoop的終止增長回調函數
        //5把children變成只讀
    }

NioEventLoopGroup中實現newChild方法函數

@Override
protected EventLoop newChild(Executor executor, Object... args) throws Exception {
    return new NioEventLoop(this, executor, (SelectorProvider) args[0]);
}

EventLoop繼承關係圖oop

輸入圖片說明

NioEventLoop.javathis

NioEventLoop(NioEventLoopGroup parent, Executor executor, SelectorProvider selectorProvider) {
    super(parent, executor, false);
    if (selectorProvider == null) {
        throw new NullPointerException("selectorProvider");
    }
    provider = selectorProvider;
    selector = openSelector();
}

super中的第三個參數在SingleThreadEventExecutor構造函數中體現,當該值爲true時,當且僅當調用addTask(Runnable)方法纔會喚醒executor的線程,同時在SingleThreadEventExecutor構造方法中也建立了一個無界隊列LinkedBlockingQueue<Runnable>()操作系統

回到NioEventLoop構造方法發現每建立一個EventLoop都會打開一個Selector。.net

總結

  1. EventLoopGroup從名字能夠看出是用來建立和管理EventLoop。
  2. EventLoopGroup有不少種,通用的是NioEventLoopGroup,還有依賴操做系統支持的EpollEventLoopGroup,在linux系統下推薦使用EpollEventLoopGroup 回答的是netty in action的做者
  3. new一個EventLoopGroup的過程實際上就是一個建立多個EventLoop的過程
  4. 每建立一個EventLoop都要打開一個Selector,因此new的時候不要用過大的nThreads參數,EventLoop只負責讀寫數據,耗時的IO操做應該交給另外一個線程池來處理。
相關文章
相關標籤/搜索