それは偉大な方言チャットスレッドプールとコアのパラメータを動作します

              目录

         1、为啥要使用线程池

         2、线程池的工作原理

         3、线程池都用哪些核心参数

         4.有界队列下的线程池的工作流程

         5.无界队列下线程池可能带来的问题
复制代码

みなさん、こんにちは、私Ninetowns 4つの最もHaohengの小さな耳。

今日は方言のスレッドプールの作品やコアのパラメータを使用することを話しています。

  1. なぜあなたは、スレッドプールを使用します

    以下は、そのようなAのシナリオがあると仮定し、顧客のシステムは、システム・インターフェースを呼び出すたびに、あなたがメッセージを処理するためのスレッドを開くために直接メッセージを取得します。

ある日、このような第二の顧客としての経験並行性の高いシナリオは、何百、何千回も、あなたをこのインターフェイスを呼び出して、すべての突然のあなたが何百、スレッド数千を作成します。

次に、あなたのシステムがされる時間を考える、それがCPUを消費しているスレッド、物事のメモリ、のすべてが突然あなたがスレッドの数十万人を作成を作成する必要があります、そして、あなたのシステムが突然ああハング、またはパフォーマンスにそうではありません急速な低下、様々な要求がタイムアウト。

だから、このシナリオに対処するためには、あなたは確かに、その後、どんなハンドルに新しいスレッド上で、どこかで実行することはできません、コードを記述します。あなたは、呼び出し元の要求の頻度を決定することはできませんので、人々は何百回も二に、あなたを呼び出す場合、それは深刻なパフォーマンスの問題が発生します。あなたは以下のように、それは、アーキテクチャの変更の上、スレッドプールを使用しようと考えることができるように:

お使いのシステムでは、複数のスレッドを設定することができますスレッドプールを作成するための良いスタートです。お使いのシステムへの顧客のシステムコールインタフェースの後、あなたは毎回処理する新しいスレッドは、あなたがメモリキューに直接メッセージを入れることができませんし、その後行われ、スレッドプール、あなたがそれを活性化させる、それがしますキューからタスクを取得し、その後に対処するためのスレッドのプールをしましょう。その結果、非常に私たちは、あなたが、システムのパフォーマンスの低下、さらにはシステムのダウンタイムアップになる多数のスレッドを作成するのと同じ時間を話すが開始されるだろう。

  1. 作品スレッドプール

あなたがスレッドプールを使用しているので、間違いなくそれは仕事の基本原理である、見ているだろう。

内部スレッドプールの構成の下にあるすべての最初には、それは主に糸+キューで構成されています。

あなたがスレッドプールにジョブを提出した場合さて、タスクは内部キューを置くことになります。スレッドプールは、スレッドの数現在のパラメータcorePoolSizeよりも大きいを見ていきます。あなたが記入したときにcorePoolSizeパラメータは、新しいスレッドプールです。この時点で、スレッドの現在の数より少なくcorePoolSize以上あれば、スレッドプールは、新しいタスクを処理するために新しいスレッドを指示します。

コアがアイドルcorePoolSizeに新しいタスクを処理するためのスレッドを使用するスレッドの数に等しくなるまで、それはありませんでした。

タスクを実行するスレッドプールのスレッドが死んでいない、それは内部キューから新しいタスクを読み取ろうとします。そこには仕事がなく、そのスレッドが新しいタスクを消費するために待っている、ライブにブロックされている場合。

  1. コアスレッドプールのパラメータは何ですか

4つの主要なパラメータ、corePoolSize、maximumPoolSize、keepAliveTimeが、キューがあります。

でも、文字通りの意味で、実際に理解することは非常に簡単です。

corePoolSizeは、スレッドのコア数です。それはあなたのスレッドプールは、非常に多くのスレッドを生き残るで、スレッドが死ぬことはない、常にメモリキューから新しいタスクを取得するために待機します。

maximumPoolSizeは、スレッドの最大数です。それはあなたのスレッドプールは、スレッドの最大数を作成することができます。

keepAliveTimeがは、生存です。言い換えれば、あなたはほとんどどのくらいのアイドルを生き残った、残りの追加のスレッドから作成、スレッドのコアに加えをcorePoolSize。

キュー、そのキューは、使用するキュー。有界キューすることができ、キューは無制限することができます。

  1. スレッドプールのキューは、国境で​​あり、ワークフロー

だから、あなたは、有界キューを使用している場合。あなたがスレッドプールを作成するときに、例えば、有界キューの設定が500のタスクまで保存することです。あなたのサービスは、これらのタスクを完了していない場合さて、corePoolSizeスレッドがビジー状態であるが、タスクのプロデューサーは、前述したように、キューに新しいタスクを生成するために行ってきました

今回は、それがcorePoolSizeより大きくない、あなたのパラメータmaximumPoolSizeの値に依存します。たとえば、corePoolSize値は5、maximumPoolSize 10です。スレッドプールは、新しいタスクを処理するために追加のスレッドが作成されます。フィギュア

タスクが現在も生産者のメッセージその怒っている、とした場合、追加のスレッドを作成することはできませんし、どのようにそれを行うには?

この時間は、タスクはアウト拒否することができます。スレッドプールは、新しいタスクのみを破棄し、例外をスローすることができ、キューがいっぱいであることを教えてくれます。

いくつかの時間を実行している場合は、メモリキュータスクが完成し、消費されている多くのkeepAliveTimeが時間よりも、それが自動的に解除された後、この時点で追加のスレッドは、より多くのcorePoolSizeのアイドルよりを作成します。

  1. 問題をもたらす可能性があり、スレッドプールの下で無制限キュー

あなたがアンバウンド形式のキューを使用している場合は、プロデューサーのタスクは、タスクを置くためにメモリのキューを維持するために、そして自分のタスクスレッドの消費量の速度は、比較的遅い多数のタスクのメモリキューバックログであれば、、、トップクラスのビジネスシナリオをします会いました何が問題の原因?

プロデューサーは、タスクにメモリキューにタスクを持っている場合、これが続けば明らかに、より多く蓄積したタスクの多くのメモリキュー、キューが増加され、メモリは最終的にさえにつながる、アップ舞い上がるますあなた系統発生OOM。

Haoheng少し耳、Haohengプログラマー:著者について。私は、ビジョンとテクノロジーの世界Haohengの誰もが、技術の世界を見てみたいです。次のFanger魏コード、持続的注意をスキャンするためにようこそ、オリジナルシリーズの大きな波が道を進んでいます

おすすめ

転載: juejin.im/post/5e5f0c4f6fb9a07cc61cee40
おすすめ