He estado jugando con diferentes estrategias para la agrupación de subprocesos utilizando ThreadPoolExecutor con JDK6. Tengo una cola de Prioridad funcionando, pero no estaba seguro de si me gustó cómo el grupo no se dimensionó después de keepAliveTime (lo que obtienes con una cola ilimitada). Entonces, estoy mirando un ThreadPoolExecutor usando LinkedBlockingQueue y la política CallerRuns.¿Por qué ThreadPoolExecutor reduce los subprocesos por debajo de corePoolSize después de keepAliveTime?
El problema que estoy teniendo ahora es que el grupo aumenta, ya que los documentos explican que debería hacerlo, pero después de que las tareas se completan y el keepAliveTime entra en juego getPoolSize muestra que el grupo se reduce a cero. a continuación el código de ejemplo debe permitir que vea la base de mi pregunta: ¿
public class ThreadPoolingDemo {
private final static Logger LOGGER =
Logger.getLogger(ThreadPoolingDemo.class.getName());
public static void main(String[] args) throws Exception {
LOGGER.info("MAIN THREAD:starting");
runCallerTestPlain();
}
private static void runCallerTestPlain() throws InterruptedException {
//10 core threads,
//50 max pool size,
//100 tasks in queue,
//at max pool and full queue - caller runs task
ThreadPoolExecutor tpe = new ThreadPoolExecutor(10, 50,
5L, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(100),
new ThreadPoolExecutor.CallerRunsPolicy());
//dump 5000 tasks on the queue
for (int i = 0; i < 5000; i++) {
tpe.submit(new Runnable() {
@Override
public void run() {
//just to eat some time and give a little feedback
for (int j = 0; j < 20; j++) {
LOGGER.info("First-batch Task, looping:" + j + "["
+ Thread.currentThread().getId() + "]");
}
}
}, null);
}
LOGGER.info("MAIN THREAD:!!Done queueing!!");
//check tpe statistics forever
while (true) {
LOGGER.info("Active count: " + tpe.getActiveCount() + " Pool size: "
+ tpe.getPoolSize() + " Largest Pool: " + tpe.getLargestPoolSize());
Thread.sleep(1000);
}
}
}
me encontré con un viejo error que parece ser este tema pero estaba cerrado: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6458662. ¿Podría estar presente en 1.6 o me falta algo?
Parece que I Rubber Ducked este (http://www.codinghorror.com/blog/2012/03/rubber-duck-problem-solving.html). El error que he vinculado anteriormente está relacionado con este: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6576792, donde el problema parece resolverse en 1.7 (cargué 1.7 y verifiqué - solucioné ...). Creo que mi principal problema fue que un error tan fundamental se mantuvo durante casi una década. Pasé demasiado tiempo escribiendo esto para no publicarlo ahora, espero que ayude a alguien.
+1 Un buen descubrimiento, me sorprendí a mí mismo al ver este comportamiento. –
Quizás sería mejor estructurar tu publicación como una pregunta y luego proporcionar lo que has aprendido como respuesta. –