網状学習コアコンポーネント(イベントループ、EventLoopGroup)

A、イベントループ、EventLoopGroup概要

  下図に示すように、NioEventLopイベントループはイベントループの属性EventLoopGroupの具体的な実装である、NioEventLoopGroupはEventLoopGroupの実現である、プールマネージャスレッドExecutorServiceのが実行ベース、その中心的な役割イベントループされ、EventLoopGroupはアセンブリセレクターを行っていますメンテナンスやメンテナンススレッドプール。

  

  左の下セレクタは、前記イベントループのメンテナンスが行われる。EventLoopGroupスレッドグループは、メンテナンス、同時実行制御、タスク処理のために、図1の右側のように。

    

   次のようにイベントループとマッピング関係についてEventLoopGroup:

  • A EventLoopGroupは、一つ以上のイベントループが含まれています。
  • イベントループを通し、唯一そのライフサイクルに結合;
  • すべての治療イベントループI / Oイベントは独自のスレッドで処理されています。
  • 唯一のイベントループに登録され、そのライフサイクル内のAチャンネル。
  • Aイベントループは、チャンネルの一つ以上に割り当てることができます。

  チャネル網状ネットワーク動作は、両方のI / O操作の参加と、I / O操作を処理するために主に抽象クラス、イベントループチャネルです。接続が到着すると、網状のチャンネルを登録し、その後、EventLoopGroupからのチャネルに結合されたイベントループを割り当て、チャンネルの全ライフサイクルは、このサービスを持っているイベントループをバインドされています。

二、NioEventLoopGroup達成

  NioEventLoopGroupオブジェクトは、チャンネル上で複数のイベントを処理するための責任がそれぞれ、内部スレッドの集合を維持するために、スレッドプールとして理解することができ、あなたが複数のスレッドの下でのデータ同期の問題を避けることができるようにチャネルのみ、スレッドに対応しています。次のコード

     // 2 NioEventLoopGroupを使用して、サーバー側のアプリケーションは、二つのイベントループグループを作成し、イベントループこれは処理スレッドに相当する網状スレッドとIO要求の処理要求を受信しています。
        // メインスレッドのクライアント接続を受け入れるためのグループ、が、無治療、ちょうどボスのように、物事をしない 
        EventLoopGroup bossGroup = 新新NioEventLoopGroup();
         // スレッドグループ、上司が接続され、受け入れ、登録への接続を受け入れます労働者は、処理フローの接続が受け入れられています。
        WorkerGroup = EventLoopGroup 新しい新 NioEventLoopGroup();

  其职责如下

  • サーバとして  Acceptor 线程クライアントへのアクセスを要求するを処理する責任があります。
  • クライアントとして  Connector 线程、接続モニタは、非同期接続の決意の結果のために、動作位置を登録する責任があります。
  • 同様に  IO 线程、ネットワークを聴くのSocketChannelからのメッセージを読むための責任、ビットをお読みください。
  • IO スレッドが相手に送信されたSocketChannel書き込まれたメッセージに責任がある発生した場合、自動的にパックは、すべてのデータ送信が完了するまで、データを送信し続け、その後の半分のためのイベントリスナーを記述するために登録され、半分のパックを書き込みます。
  • 定时任务线程スケジュールされたタスクを実行することができ、例えば、検出リンクがアイドル状態で、ハートビートメッセージなどを送信します。
  • 実行のスレッドとして、一般的なタスクスレッド(Runnableを)を実行することができます。

  上記のコードbossGroupとworkerGroupを作成するときに、我々は具体的な実現NioEventLoopGroupを見て、引数なしのコンストラクタNioEventLoopGroupを使用します。

    / **
     * 1、引数なしのコンストラクタNioEventLoopGroupで我々初見:
     *機能:0スレッド
     * / 
    パブリックNioEventLoopGroup(){
         この(0 )。
    }

    / **
     * 2、コンストラクタを呼び出すように続けました。
     *機能:指定のスレッド0、およびエグゼキュータはnullです
     * / 
    パブリック NioEventLoopGroup(int型にnthreads){
         この(nthreadsの値、(執行)NULL );
    }

    / **
     * 3、コンストラクタを呼び出すために続け
     *機能:ヘルパークラスのセレクタを指定するこのコンストラクタ「SelectorProvider.providerを()」
     * / 
    パブリック NioEventLoopGroup(INT nthreadsの値、エグゼキュータ){
         この(nthreadsの値、エグゼキュータ、SelectorProvider.provider())。
    }

    / **
     * 4、コンストラクタを呼び出すために継続
     *機能:選択した戦略を生成するためのデフォルトの選択ポリシーの工場を初期化します
     * / 
    パブリック NioEventLoopGroup(int型にnthreads、エグゼキュータ、最終あるSelectorProviderあるSelectorProvider){
         この(nthreadsの値、エグゼキュータ、あるSelectorProvider、DefaultSelectStrategyFactory.INSTANCE)。
    }

    / **
     * 5、コンストラクタを呼び出すために継続
     *機能:指定拒否戦略:RejectedExecutionHandlers.reject()
     * / 
    パブリック NioEventLoopGroup(int型にnthreads、エグゼキュータ、最終あるSelectorProviderあるSelectorProvider、最終SelectStrategyFactory selectStrategyFactory){
         スーパー(nthreadsの値、エグゼキュータ、あるSelectorProvider、selectStrategyFactory、RejectedExecutionHandlers.reject())。
    }

  次のパラメータに上記コンストラクタコールの一連の後、今度は対応します:

  • nthreadsの値:0
  • エグゼキュータ:ヌル
  • あるSelectorProvider:SelectorProvider.provider()
  • selectStrategyFactory:DefaultSelectStrategyFactory.INSTANCE
  • )(RejectedExecutionHandlers.reject:と拒否戦略を指定します

  残りのコードを分析するために続行します。

    / **
     * 6、ここから親クラスのコンストラクタを呼び出すMultithreadEventLoopGroup
     *機能:スレッドの数は、0を指定した場合、スレッドDEFAULT_EVENT_LOOP_THREADSのデフォルト数を使用し、
     * DEFAULT_EVENT_LOOP_THREADが静的ブロック内で実行されます。
     * / 
    保護 MultithreadEventLoopGroup(int型にnthreads、エグゼキュータ、オブジェクト...引数){
         スーパー(nthreadsの値== 0?DEFAULT_EVENT_LOOP_THREADS:nthreadsの値、エグゼキュータ、引数);
    }

    / **
     * 6.1我々は、静的コードブロックを見て
     *機能:スレッドの数が指定されていないNioEventLoopGroupを初期化する場合は、 `、デフォルトはCPUのコア数がある* 2 ':このステップは、キーポイントに来ています。
     * / 
    プライベート 静的 最終 int型のDEFAULT_EVENT_LOOP_THREADS。

    静的{
        DEFAULT_EVENT_LOOP_THREADS = Math.max(1 、SystemPropertyUtil.getInt(
                 "io.netty.eventLoopThreads"、NettyRuntime.availableProcessors()* 2))
    }

    / **
     * 7、親クラスのコンストラクタMultithreadEventLoopGroupを呼び出すために継続
     *機能:指定選択EventExecutor工場DefaultEventExecutorChooserFactory、
     *この植物は、主に次の利用可能なEventExecutorを選択するために使用されます
     * / 
    保護 MultithreadEventExecutorGroup(int型にnthreads、エグゼキュータ、オブジェクト...引数){
         この(nthreadsの値、エグゼキュータ、DefaultEventExecutorChooserFactory.INSTANCE、引数)。
    }

    / **
     * 8、MultithreadEventLoopGroupは、親クラスのコンストラクタを呼び出すために続け、これはいくつかの非中核コードを削除するためのコアコードです
     *個別の分析の役割
     * / 
    保護 MultithreadEventExecutorGroup(INT nthreadsの値、エグゼキュータ、EventExecutorChooserFactory chooserFactory、オブジェクト...引数){

        // 1、
         // エグゼキュータチェックはエグゼキュータ・インタフェースを実装し、作成した場合ThreadPerTaskExecutorが空で、空ではありません
         // このexecutorがから、実際には、すべてのNioEventLoopあるスレッドプール内のすべてのスレッドを実行するために使用されます
         / / 知っているかもしれませんNioEventLoopコンストラクタは、NioEventLoopコンストラクタは、このパラメータの執行に合格しています。
        IF(エグゼキュータ== NULL ){
            エグゼ = 新しいThreadPerTaskExecutor(newDefaultThreadFactory());
        }

        // 2、
         // ここでは子供の配列は、実際には、それは配列を指定することで、スレッドプールスレッドプールのスレッドを達成することである、達成するためにコアスレッドプールである;
         // 各要素の配列は、イベントループ、イベントループがEventExecutorの子である実際にありますインタフェース。
        =子供の新しい新しいEventExecutor [nthreadsの値]。

        // 子配列の例ループのために、NioEventLoopはオブジェクト
        のためにint型 I = 0; I <nthreadsの値; I ++ ){
             ブール成功= falseに

            // 。3、
             // NioEventLoopGroupクラスに実装newChildで(エグゼキュータ、引数)関数
             // エッセンスは、クラスインスタンスNIOEventLoopに堆積される 
            子供[I] = newChildノード(エグゼキュータ、引数)。
            成功は = ;
        }

        // 4、スレッドファクトリセレクタを実行する例は:子供たちは、セレクタゲット 
        セレクタ= chooserFactory.newChooser(子供を)。

        // 各リスナー・スレッドイベントループの追加スレッド終了する5、
        最終 FutureListener <オブジェクト> = terminationListener 新しい新しい FutureListener <オブジェクト> (){
            @オーバーライド
            公共 のボイド operationComplete(フューチャー<オブジェクト>未来)スロー例外{
                 場合(terminatedChildren.incrementAndGet()== {children.lengthを)
                    terminationFuture.setSuccess(NULL )。
                }
            }
        }。

        // 6、セットの重量に対応するセットに子を追加するには、読み取り専用表します。
        SET <EventExecutor> = childrenSet 新しい新 A LinkedHashSetの<EventExecutor> (children.length)。
        Collections.addAll(childrenSet、子供)。
        readonlyChildren = Collections.unmodifiableSet(childrenSet)。
    }
}

/ **
 * 8.3.1私たちは、次の中にnewChild(エグゼキュータ、引数)メソッドを見て
 *私たちは、リターンがNioEventLoopで見ることができます
 * /
@オーバーライド
保護されたイベントループにnewChild(エグゼキュータエグゼキュータ、オブジェクト...引数)がスロー例外{
     リターン 新しい NioEventLoop(この、エグゼキュータ、(あるSelectorProvider)引数[0 、]
            ((SelectStrategyFactory)引数[ 1])newSelectStrategy()、(のRejectedExecutionHandler)引数[2 ])。
}

  上記をまとめると:

1 NioEventLoopGroupスレッドの数を初期化するとき、スレッドは、デフォルト番号が使用され、すなわち`指定されていないスレッド= CPUコア* 2「;
 2 各オブジェクトが内部NioEventLoopGroupのセットは、そのサイズである` NioEventLoopアレイをexecutable`たが。 nthreadsの値、これは構成するスレッドプールを `、NIOEventLoop分かりやすい成果はスレッドです」。
3 。NIOEventLoopは、すべてのスレッドが同じエグゼキュータ、あるSelectorProvider、SelectStrategyFactory、のRejectedExecutionHandlerを使用して特定のに属します
    のNIOEventLoopGroup。これは、newChildノード(エグゼキュータ、引数)からである。この方法は、見ることができる:newChildが実装()NIOEventLoopGroupに実装されています。
4 IOイベントは、あなたが実行のうち、スレッドプールのスレッドの中から選択する必要がある場合は、この時間NioEventLoop選択ポリシーがGenericEventExecutorChooserによって実装されており、そのクラスを呼び出す()の正方形次の方法。
5.各オブジェクトは、動的に選択]を選択しNioEventLoopの数に基づいて説明するNioEventLoop NioEventLoopGroup対応するセレクタを有し、(もしビット演算2の電源、そうでなければ通常のポーリング)

  要約すると、結果NioEventLoopGroup主な機能は、NioEventLoopの一定数を作成することですが、NioEventLoopの本当の焦点は、それが実行の全体ネッティースレッドへの鍵です。

おすすめ

転載: www.cnblogs.com/jing99/p/12515157.html