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の本当の焦点は、それが実行の全体ネッティースレッドへの鍵です。