¿Es posible que dos ExecutorServices para compartir un grupo de subprocesos?
-
21-08-2019 - |
Pregunta
Tengo una colección de registros a procesar, y el procesamiento se puede paralelizar, por lo que he creado un ExecutorService (a través de Agentes ejecutivos # newCachedThreadPool () ). La transformación de un registro individual es, en sí, compuesto de las etapas paralelizables, así que me gustaría usar otro ExecutorService
. ¿Hay una manera fácil de hacer que este nuevo uso de la misma agrupación de hebras subyacente? ¿Es incluso deseable? Gracias.
Solución
Para responder a su pregunta: no , dos ExecutorService
objetos no pueden compartir un grupo de subprocesos. Sin embargo, usted puede compartir un Executor
entre sus objetos, o bien crear varios ejecutores, según sea necesario, aunque esto es menos recomendable.
La mejor solución:. Compartir el <=> entre sus objetos
Otros consejos
Respuesta corta:. No
Respuesta larga: Usted necesitará su propia aplicación para hacer eso. ExecutorService
es una interfaz y AbstractExecutorService
es bastante fácil de implementar.
Si quiere dos <=> compartir mismo ThreadPool (por ejemplo, con diferente valor máximo hilo activo), puede utilizar el patrón de proxy para hacer ThreadPool compartir <=>.
Puede que acaba de pasar una referencia a la ExecutorService existente para los objetos de los trabajadores?
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);
}
}
Hay algunas buenas razones para querer hacer esto, tales como los límites y las métricas por cola separadas. Que yo sepa, Cassandra 2.1 no ganó de manera insignificante el uso de una aplicación de servicio ejecutor con un grupo de subprocesos compartida; el código es en https: / /github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/concurrent/SEPExecutor.java .