42. Nio (マルチスレッド最適化 (問題分析))

Nio (マルチスレッド最適化 (問題分析))

問題:クライアントはデータを送信しますが、クライアントは読み取り可能なイベントのコンテンツを印刷できません (worker.select イベントに入りません)。

 

問題の原因:セレクタのselectメソッドとscのregisterメソッドに問題がある

 

Select メソッド (イベント) は worker0 スレッドで実行され、register メソッド (登録) は Boss スレッドで実行されます (これらは別のスレッドで実行されます) が、これらはすべて同じセレクターを使用します (両方ともワーカー セレクター (セレクター))。 。select がブロックされている限り、レジスタは待機する必要があります (たとえば、イベントが発生すると、select が起動され、worker0 が実行され、その後、ボス スレッドが実行されます)。

ロジック:ここでのロジックは、最初にセレクターを初期化し、worker0 スレッドを開始するというものです。したがって、セレクターの選択が最初に実行され、次に次のレジスタが実行されます(前がブロックされているため、このメソッドは妨げられます)。

ロジックを改善します。最初に彼をボス スレッドのセレクターに登録し、次にセレクターを選択する必要があります (最初に結果を選択します。イベントが存在しない (使用できない) 場合、セレクターはブロックされます)。以下のイベントは登録されません。セレクターに登録されます)

 

 

最適化 1: worker.register を sc.register に置きます (これら 2 つの機能は異なります。前者はワーカー スレッドの初期化と開始 (slelct メソッド) であり、後者はイベントをセレクターに登録することです)

このようにして、ワーカー スレッドはボス スレッドと同時に開始されます。準備完了状態になり、CPU がこれら 2 つのスレッドをスケジュールしても、ワーカーが最初に実行状態になるとは限りません。

 

 

しかし、これは機能しません。これはクライアントの偶発的なイベントです (ボスはワーカーの高度な実行状態にあります)。ただし、複数のクライアントがある場合、セレクターの select メソッドを実行した後、彼は間違いなくブロックします。初めて。そうすると、次のボスのレジスターが後ろにあるはずです

 

 

おすすめ

転載: blog.csdn.net/logtcm4/article/details/127832591