2 つの ExecutorService がスレッド プールを共有することは可能ですか?
-
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.