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.

¿Fue útil?

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 .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top