3

長時間実行されるスレッドにスレッド プールを使用するか、独自のスレッドを開始する必要がありますか? 設計パターンはありますか?

4

1 に答える 1

3

残念ながら、それは依存します。常にスレッド プールを使用する必要があるという厳密なルールはありません。

スレッド プールは、次の 2 つの主要な機能を提供します。

  1. スレッドの作成/再利用の委任。
  2. 背圧

IMO、興味深いのは背圧特性ですが、多くの場合、最もよく理解されていません。マシンは限られた一連のリソースで実行されます。(たとえば) 8 つの CPU コアがあり、それらがすべてビジー状態で動作している場合、何らかの方法で、少なくともレイテンシーに関しては、より多くの作業を追加する (より多くのタスクを送信する) ことは役に立たないことを通知したいと考えています。

これが、実装で任意のjava.util.concurrent.ExecutorServiceを指定できる理由です。java.util.concurrent.BlockingQueueこのキューがいっぱいになると、スレッド プールが進行中のタスクを完了するまで、スレッドの呼び出しがブロックされます。

スレッド プール内に実行時間の長いスレッドがあるかどうかは、それが何をしているかによって異なります。スレッドが常にビジーである (つまり、完了しない) 場合、そのスレッドは常にスレッド プール内のスロットを占有しますが、これは無意味です。

スレッドの委任された作成/再利用について; 1 つは長期実行タスク用、もう 1 つはその他のタスク用の 2 つのプールを持つことができます。または、1 つのスロットを備えた長時間実行スレッド プールを使用すると、必要に応じて、2 つの長時間実行タスクが同時に実行されるのを防ぐことができます。

ご覧のとおり、唯一の適切な答えはありません。要するに、何を達成しようとしているのか、手元にあるリソースをどのように使用したいのかということです。

于 2015-09-16T12:18:46.923 に答える