2 つの ExecutorService がスレッド プールを共有することは可能ですか?

StackOverflow https://stackoverflow.com/questions/368613

  •  21-08-2019
  •  | 
  •  

質問

処理するレコードのコレクションがあり、処理は並列化できるため、 ExecutorService (経由 Executors#newCachedThreadPool())。個々のレコードの処理自体は並列化可能なステップで構成されているため、別のステップを使用したいと考えています。 ExecutorService. 。この新しいスレッドに同じ基礎となるスレッド プールを使用させる簡単な方法はありますか?それは望ましいことでしょうか?ありがとう。

役に立ちましたか?

解決

あなたの質問に答えるには: いいえ, 、 二 ExecutorService オブジェクト できない スレッドプールを共有します。ただし、共有することはできます ExecutorService または、必要に応じて複数の Executor を作成しますが、これはあまりお勧めできません。

最良の解決策:共有する Executor オブジェクトの間。

他のヒント

短い答え:いいえ。

より長い答え:これを行うには独自の実装が必要になります。 ExecutorService インターフェースであり、 AbstractExecutorService 実装は非常に簡単です。2つ欲しい場合は ExecutorService 同じ ThreadPool を共有する (例:アクティブ スレッドの最大値が異なります)、プロキシ パターンを使用して ThreadPool 共有を行うことができます ExecutorService.

既存の ExecutorService への参照をワーカー オブジェクトに渡すだけでよいでしょうか?

public class Task implements Runnable {
    private final ExecutorService threadPool;
    private final SubTask[] subtasks;

    public Task(ExecutorService threadPool) {
        this.threadPool = threadPool;
        this.subtasks = createSubtasksIGuess();
    }

    public void run() {
        for(SubTask sub : subtasks)
            threadPool.submit(sub);
    }
}

これを行うには、キューごとに個別の境界とメトリックを設定するなど、いくつかの正当な理由があります。私の知る限り、Cassandra 2.1 は、共有スレッド プールでエグゼキュータ サービス実装を使用することで少なからずメリットを得ています。コードは次のとおりです https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/concurrent/SEPExecutor.java.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top