2012-03-15 14 views
1

Thread-poolを使用する理由の例を説明することができます。Executorを使用したThreadPoolsのPOC(概念実証)

理論的にはExecutorsでスレッドプールの使用について知っています。

私はチュートリアルの数を経ていますが、私たちはスレッドプールを使用すべき理由についていかなる実質的に例を取得していない、それは、スケーラビリティとパフォーマンスの面でnewFixedThreadPoolまたはnewCachedThreadPoolまたはnewSingleThreadExecutor

することができます。

パフォーマンスとスケーラビリティに関して、その事例を教えてもらえますか?

答えて

2

まず、昨日書いたスレッドプールのこの説明を確認してください:Android Thread Pool to manage multiple bluetooth handeling threads?(これはアンドロイドについてですが、古典的なJavaでは同じです)。

私が常にスレッドプールを使用する主な用途は、プロデューサ - コンシューマという非常によくある問題を非常にうまく管理していることです。このパターンでは、誰か(消費者)が処理する作業項目(プロデューサ)を常に送信する必要があります。作業項目は、ソケット、データベース、またはディスクファイルのコレクションなどのストリーム形式のソースから取得され、効率的に処理するには複数のワーカーが必要です。ここで特定できる主なコンポーネントは次のとおりです。

  • プロデューサー:ジョブ
  • にジョブが
  • 消費掲載されているキュー掲示し続けるスレッド:キューからジョブを取得し、それらを実行するワーカースレッドを

これに加えて、同期を行わずにキューを読み書きするとデータが壊れたり矛盾したりする可能性があるため、このすべてを正しく動作させるために同期を行う必要があります。また、システムが効率的になるようにする必要があります。なぜなら、消費者は何もしなくてもCPUサイクルを浪費してはならないからです。

このパターンは非常に一般的ですが、ゼロから実装するにはかなりの労力が必要です。エラーが発生しやすく、慎重に検討する必要があります。

解決策はスレッドプールです。作業キュー、コンシューマスレッド、必要なすべての同期を非常に便利に管理します。あなたがする必要があるのは、プロデューサーの役割を果たし、タスクをプールに与えることだけです!

1

私は問題から始めて、解決策を見つけようとします。

あなたがしている方法を開始する場合、解決する問題を探しているソリューションを持つことができ、不適切に使用する可能性があります。

スレッドプールの使用を考えることができない場合は、使用しないでください。 ;)

人々がよくやっている間違いは、現在多くのCPUを持っているため、すべてがこのような理由で使用されていると仮定することです。そのようなディスクスペースがたくさんあると言って、私はそれをすべて使う方法を見つけなければなりません。あなたがバウンド忙しいCPUを持っている場合は

スレッドプールを使用するための良い理由は、(むしろ、一つのスレッドで、ノンブロッキングIOを使用するよりも)

をCPUバウンドプロセスのパフォーマンスとIOのシンプルバインドのプロセスを改善することです独立して実行できるタスクを実行するプロセスであり、スレッドプールの良いユースケースです。

注:スレッドプールにはスレッドが1つしかないことがよくあります。これらには特定の静的ファクトリがあります。単純なバックグラウンドワーカーが必要な場合は、これがオプションになる可能性があります。

注2:よくある間違いは、CPUバインドされたタスクが数百または数千のスレッドで最適に動作すると仮定することです。最適なスレッド数は、コアまたはコアの数になります。これらのすべてがビジー状態になると、追加のスレッドでオーバーヘッドが追加されることがあります。

-1

私は「なぜJavaのスレッドプールを使用」し、見つかったググ:

スレッドプールがスレッド ライフサイクルのオーバーヘッドとリソーススラッシングの問題の問題の両方の解決策を提供しています。

http://www.ibm.com/developerworks/library/j-jtp0730/index.html

newCachedThreadPool方法は、拡張可能な スレッドプールがエグゼキュータを作成します。このエグゼキュータは、 多くの短命のタスクを起動するアプリケーションに適しています。 newSingleThreadExecutorメソッドは、一度に1つのタスクを実行する エグゼキュータを作成します。新しいスレッド(およびそれ自身のスタック)を初期化

http://docs.oracle.com/javase/tutorial/essential/concurrency/pools.html

+0

-1 ...それは、学習を理解するのではなく、 – moodywoody

1

コストのかかる操作です。

スレッドプールは、すでに作成されたスレッドを再利用することによってこのコストを回避する目的で使用されます。したがって、スレッドプールを使用するとパフォーマンスが向上し、毎回新しいスレッドが作成されます。

作成したスレッドは、使用後に「削除」する必要があります。そのため、ガーベジコレクションのコストが高くなり、メモリがいっぱいになるほど頻度が高くなります。

この分析はパフォーマンスの観点からのものです。現時点でスケーラビリティの観点からスレッドプールを使用する利点は考えられません。