スレッドプールを使用する理由について、例を挙げて説明できる人はいますか。
理論的には、エグゼキューターでのスレッドプールの使用について知っています。
私は多くのチュートリアルを経験しましたが、スレッドプールを使用する必要がある理由についての実際的な例は得られませんでした。
スケーラビリティとパフォーマンスの面で。
誰かがパフォーマンスとスケーラビリティについて例を挙げて説明してくれませんか?
スレッドプールを使用する理由について、例を挙げて説明できる人はいますか。
理論的には、エグゼキューターでのスレッドプールの使用について知っています。
私は多くのチュートリアルを経験しましたが、スレッドプールを使用する必要がある理由についての実際的な例は得られませんでした。
スケーラビリティとパフォーマンスの面で。
誰かがパフォーマンスとスケーラビリティについて例を挙げて説明してくれませんか?
まず、昨日書いたスレッドプールの説明を確認してください:複数のBluetoothハンドリングスレッドを管理するためのAndroidスレッドプール?(わかりました、それはアンドロイドについてでした、しかしそれは古典的なジャバのために同じです)。
スレッドプールを使用するために私がいつも見つけている主な用途は、非常に一般的な問題である生産者/消費者を非常にうまく管理することです。このパターンでは、誰かが他の誰か(消費者)によって処理されるように、常に作業項目(プロデューサー)を送信する必要があります。作業項目は、ソケット、データベース、ディスクファイルのコレクションなど、ストリームのようなソースから取得され、効率的に処理するには複数のワーカーが必要です。ここで識別できる主なコンポーネントは次のとおりです。
これに加えて、同期なしでキューの読み取りと書き込みを行うとデータが破損して一貫性が失われる可能性があるため、これらすべてを正しく機能させるには同期を使用する必要があります。また、消費者は何もすることがないときにCPUサイクルを浪費してはならないため、システムを効率的にする必要があります。
現在、このパターンは非常に一般的ですが、最初から実装するにはかなりの労力が必要であり、エラーが発生しやすく、注意深く確認する必要があります。
解決策はスレッドプールです。作業キュー、コンシューマスレッド、および必要なすべての同期を非常に便利に管理します。あなたがする必要があるのは、プロデューサーの役割を果たし、プールにタスクを与えることです!
私は問題から始めて、その解決策を見つけようとします。
今までの方法で始めると、解決すべき問題を探しているソリューションができてしまい、それを不適切に使用する可能性が高くなります。
スレッド プールの用途が思い浮かばない場合は、使用しないでください。;)
人々が犯すよくある間違いは、現在多くの CPU を持っているため、それ自体が理由であるかのようにすべてを使用する必要があると思い込むことです。ディスク容量がたくさんあるので、それをすべて使用する方法を見つけなければならないと言っているようなものです。
スレッド プールを使用する正当な理由は、(1 つのスレッドで非ブロッキング IO を使用するのではなく) CPU バウンド プロセスのパフォーマンスと IO バウンド プロセスの単純さを改善するためです。
独立して実行できるタスクを実行するビジーな CPU バウンド プロセスがある場合は、スレッド プールの適切な使用例があります。
注: 多くの場合、スレッド プールには 1 つのスレッドしかありません。これらには特定の静的ファクトリがあります。単純なバックグラウンド ワーカーが必要な場合は、これがオプションになる可能性があります。
注 2: よくある間違いは、CPU バウンドのタスクが数百または数千のスレッドで最適に実行されると想定することです。スレッドの最適な数は、使用しているコアまたは CPU の数です。これらすべてがビジー状態になると、追加のスレッドがオーバーヘッドを追加するだけであることがわかる場合があります。
新しいスレッド (および独自のスタック) の初期化は、コストのかかる操作です。
スレッド プールは、作成済みのスレッドを再利用することでこのコストを回避するために使用されます。したがって、スレッドプールを使用すると、毎回新しいスレッドを作成するよりもパフォーマンスが向上します。
また、作成されたスレッドは、使用後に「削除」する必要がある場合があることに注意してください。これにより、ガベージ コレクションのコストが増加し、ガベージ コレクションが発生する頻度が高くなります (メモリがすぐにいっぱいになるため)。
この分析は、パフォーマンスの観点からのものです。現時点では、スケーラビリティの点でスレッド プールを使用する利点は思いつきません。
「Javaスレッドプールを使用する理由」をグーグルで検索したところ、次のことがわかりました。
スレッド プールは、スレッドのライフサイクル オーバーヘッドの問題とリソースのスラッシングの問題の両方に対するソリューションを提供します。
http://www.ibm.com/developerworks/library/j-jtp0730/index.html
と
newCachedThreadPool メソッドは、拡張可能なスレッド プールを持つエグゼキューターを作成します。このエグゼキューターは、多くの短期間のタスクを起動するアプリケーションに適しています。newSingleThreadExecutor メソッドは、一度に 1 つのタスクを実行するエグゼキュータを作成します。
http://docs.oracle.com/javase/tutorial/essential/concurrency/pools.html