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