Necesito implementar un grupo de subprocesos en Java (java.util.concurrent) cuyo número de subprocesos tiene un valor mínimo cuando está inactivo, crece hasta un límite superior (pero nunca Además, cuando los trabajos se envían más rápido de lo que terminan de ejecutarse, y se reduce al límite inferior cuando se realizan todos los trabajos y no se envían más trabajos.Creación de un grupo de subprocesos dinámico (creciente/decreciente)
¿Cómo implementarías algo así? Imagino que este sería un escenario de uso bastante común, pero aparentemente los métodos de fábrica java.util.concurrent.Executors
solo pueden crear pools y pools de tamaño fijo que crecen sin límites cuando se envían muchos trabajos. La clase ThreadPoolExecutor
proporciona los parámetros corePoolSize
y maximumPoolSize
, pero su documentación parece implicar que la única manera de tener más de corePoolSize
hilos al mismo tiempo es usar una cola de trabajos acotada, en cuyo caso, si ha alcanzado los hilos maximumPoolSize
, ¿Obtendrá rechazos de trabajo que tiene que tratar usted mismo? Se me ocurrió esto:
//pool creation
ExecutorService pool = new ThreadPoolExecutor(minSize, maxSize, 500, TimeUnit.MILLISECONDS,
new ArrayBlockingQueue<Runnable>(minSize));
...
//submitting jobs
for (Runnable job : ...) {
while (true) {
try {
pool.submit(job);
System.out.println("Job " + job + ": submitted");
break;
} catch (RejectedExecutionException e) {
// maxSize jobs executing concurrently atm.; re-submit new job after short wait
System.out.println("Job " + job + ": rejected...");
try {
Thread.sleep(300);
} catch (InterruptedException e1) {
}
}
}
}
¿Estoy pasando por alto algo? ¿Hay una mejor manera de hacer esto? Además, dependiendo de los requisitos, puede ser problemático que el código anterior no termine hasta que al menos (creo) (total number of jobs) - maxSize
trabajos hayan terminado. Entonces, si desea poder enviar un número arbitrario de trabajos al grupo y proceder de inmediato sin esperar a que termine ninguno de ellos, no veo cómo podría hacerlo sin tener un hilo de "sumisión de trabajo" dedicado que administre la cola ilimitada requerida para contener todos los trabajos enviados. AFAICS, si está utilizando una cola ilimitada para ThreadPoolExecutor, su recuento de hilos nunca crecerá más allá de corePoolSize.
Debo admitir que no veo la utilidad de un threadpool de tamaño dinámico. ¿Su número de procesadores en su placa cambia durante el tiempo de actividad de su aplicación? – corsiKa
¿Por qué 'newCachedThreadPool' no es adecuado para su situación? Elimina automáticamente los hilos que ya no se utilizan. – Tudor
¿Qué pasaría si tus hilos inactivos no murieran? Supongamos que tiene un grupo de tamaño fijo del tamaño máximo todo el tiempo. ¿Qué pasaría? –