Javaマルチスレッドの詳細な理解と原則的な解釈



1.なぜ複数のスレッドが必要なのですか

この質問は、基盤
が弱い人を対象としています。まず、QPSの計算式(同時実行数/応答時間)について説明します。マルチスレッドの使用は、同時実行数を増やすこと、つまりQPSを改善することです。スレッドが非常に多いためです。 QPSが多いほど、パフォーマンスが高くなるというのは本当ですか?もちろんそうではありません。分子は増えましたが、分母も増えました。マルチスレッドを使用すると、CPUのタイムスライスが開き、時間のかかるコンテキストスイッチングが増えます。したがって、スレッドが多いほど良いとは言えません
理由2:ほとんどのプロジェクトでシングルスレッドが使用されている場合、要求から応答まで、応答後のプロトコル分析とデータ処理のみがCPUを占有し(コンピューティングサービスは考慮されません)、要求がサービスに送信された後、CPUはアイドル状態になります。状態、IO /ディスク処理の終了を待っています。マルチスレッドの導入後、プログラムがIOを処理しているとき、CPUは他のことを処理し、現在のスレッドがCPUを必要とするときに処理に戻ることができます。したがって、マルチスレッドはCPUを最大限に活用してパフォーマンスを向上させることができます。注意深い友人はマルチスレッディングの機能を発見したはずです。マルチスレッディングは実際には同時に実行されませんが、異なるタイムスライスは異なるタスクを実行するために前後に切り替わりますが、CPU処理の効率は非常に速く、人々に同時にいるように感じさせます実施した

2.スレッドプールを使用する場合、スレッドプール内のスレッド数を設定する方法

スレッドプール内のスレッド数の設定は、多くの場所で導入する必要があります。結果を読んだだけで、原則がわからないと思います。ここで詳しく紹介します。
まず、いくつかのキーワード、cpuコア、IOを多用するサービスについて説明します。コンピューティング集約型サービス、ブロッキング係数=ブロッキング時間/(ブロッキング時間+コンピューティング時間);

ここでのブロッキングはIO用であるため、ブロッキング時間はIO時間、コンピューティング時間レベルのCPU時間、
次に別の例を示します。サービスのブロッキング時間が50ミリ秒、計算時間が10ミリ秒の場合、つまり、cpuのアイドル時間は50ミリ秒です。この期間中に、cpuはそのような要求を5つ処理できます。さらに、最初の要求は処理の合計です。 6リクエスト。

次に
、スレッド数= ncpu /(1-ブロッキング係数)の式を提示し
、上記の50と10を計算に入れます。シングルコアの場合、6の場合、クアッドコアは約24スレッドを設定できます。
上記の式もこれは次のようになります。スレッド数= ncpu *(1 +ブロッキング時間/計算時間);

ここを見ると、誰もがスレッド数の計算方法を理解しているはずですオンラインで計算量の多いサービスのスレッド数がなぜ表示されるのかについて質問することがあります。式= ncpu + 1(今のところ式を無視)は、IOタイプのサービスに設定されたスレッドの数よりもはるかに少ないです。これは、サービス自体のほとんどが計算され、計算が影響を受けるため、計算タイプのサービスが呼び出されるためです。 CPU時間なので、サービスはほとんどすべての計算(CPU)に時間がかかるため、この機能によれば、全員が上記のブロック時間を0に、計算時間を50に変更し、最初の式が使用されます。見つかった場合は1コアになります。スレッド数だけですが、ncpu + 1の理由は何ですか?なぜ+1?それを実際に考慮に入れると、コンピューティングサービスがすべての計算になるわけではありません。常にある程度のIO時間がかかります。これは間違いなくです。次に、パラメータを変更します。IO時間のかかる10、計算の時間のかかる50、次にこれこれに対応します。したがって、スレッド数= ncpu /(1-ブロッキング係数)は一般式です。同時に、ブロッキング係数が大きいほど、より多くのスレッドを設定でき、その逆も同様であるという別の結論が導き出されます。

3. CPU使用率はどのように計算されますか?CPUが高すぎてプログラムがクラッシュするのを防ぐ方法

CPU使用率= CPU計算時間/ CPU計算時間+ CPUアイドル時間したがって、CPU計算時間が100mmでアイドル時間が900mmの場合、使用率は10%です。計算時間が500mmでアイドル時間が0mmの場合は、レートは100%です(システムは単位時間あたりの値をカウントします)。したがって、CPUが計算を続けると、CPUレートは常に変化します。
CPUが高すぎる場合は、最初に原因を特定する必要があります。新しいスレッドを盲目的に開くか、プログラムの計算が複雑すぎるか、意図しないループまたは無限のループです。盲目的に開いているスレッドはスレッドプールによって解決できます。後者の2つは最適化です。プログラムが最適化されていない場合は、sleep(0)、sleep(1)を使用して解決できます。sleep(0)の意味を尋ねられる人もいますが、CPUを最適化できますか?もちろん、cpuを使用しますが可能です。 0ミリ秒スリープしますが、別の機能はcpuタイムスライスの競合(再選)をトリガーすることです。そのため、cpu全体を独占するタイムスライスはなく、cpuは即座に急上昇します。
これが事実であるため、別のことを説明します。質問、sleep()とyield()の違いは何ですか?

  1. sleep()が実行された後、すべてのタイムスライスがトリガーされて一緒に選出され、各タイムスライスは次回の実行権を取得する可能性があります。
  2. スレッドはsleep()を実行してブロッキング状態にし、yield()メソッドを実行して準備完了状態にします
  3. sleep()ステートメントはInterruptedExceptionをスローします; yield()メソッドは例外をスローすることを宣言しません
  4. sleep()には時間ブロック時間パラメーターがあり、yield()にはパラメーターがありません(CPUの実行時間はJVMによって直接制御されます)

私は手で各単語をタイプしました、私に親指を上げてサポートしてください、ありがとう!異なる意見がある場合は、コメントしてください。

再版の出所を教えてください、オリジナルは簡単ではありません!

おすすめ

転載: blog.csdn.net/weixin_43225813/article/details/109033843