7

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

4

4 に答える 4

7

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

最善の解決策:Executorオブジェクト間で共有します。

于 2008-12-15T15:25:09.213 に答える
6

簡単な答え: いいえ。

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

于 2008-12-15T15:56:41.317 に答える
2

既存の 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);
    }
}
于 2008-12-15T15:17:56.857 に答える
1

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

于 2014-12-18T16:58:52.553 に答える