9

プログラム/アプリケーションの実行ごとに複数のエグゼキュータ サービスを作成するのは、どのような場合に適していますか? executors.newcachedthreadpool()最初から起動してすべての呼び出し可能オブジェクトを送信するのではなく、なぜそれを行うのでしょうか。

4

2 に答える 2

7
  • さまざまなフレーバーが必要になる場合があります (固定スレッド プールやスケジュールされたエグゼキューターなど)。
  • カプセル化: 特定のクラスがエグゼキューターを介して実行する必要がある場合、このクラスがその実行ポリシー (実装の詳細) を決定する責任を負うことは理にかなっています
  • 特殊化 - 前のポイントの結果:
    • 一部のタスクは多くのスレッドを必要とします (通常はネットワーク タスク)
    • 他の人は少数しか必要としません(CPUバウンドタスク)
    • 1つだけを使用する必要があるものもあります(たとえば、ローカルハードドライブで読み取り/書き込みを行う場合)
  • いくつかのタスクの実行方法を呼び出し元のコードで制御したいので、オブジェクトにエグゼキューターを渡したい状況は確かにあります。

要するに、十分に大きなプロジェクトの場合、プログラム全体で 1 つのスレッド プールだけを使用する理由が思い浮かびません。

于 2012-09-16T23:06:37.640 に答える
1

エグゼキューター サービスを追加する典型的なユース ケースは、サービスで異なるスレッド プーリング戦略を使用する場合、または 2 つの異なるプール サイズを使用する場合です。アプリケーションには、大規模な固定サイズのプールに送信するランナブルのクラスと、より小さなプールが必要な別の種類のランナブルが含まれる場合があります。

ExecutorService にはいくつかの実装があることに注意してください。

  1. ThreadPoolExecutor
  2. ScheduledThreadPoolExecutor

ThreadPoolExecutor のコンストラクター パラメーターを確認してください。これらはすべて、送信するタスクの種類に基づいて調整する必要があるものです。

ThreadPoolExecutor(int corePoolSize, 
   int maximumPoolSize, 
   long keepAliveTime, 
   TimeUnit unit, 
   BlockingQueue<Runnable> workQueue)

Queue を渡すこともできるため、スレッド プールが使用するキューイング戦略を制御できることに注意してください。

于 2012-09-16T23:05:19.253 に答える