Ho lavorato con strategie diverse per il pooling di thread utilizzando ThreadPoolExecutor con JDK6. Ho una coda con priorità che funziona, ma non ero sicuro se mi piacesse il modo in cui il pool non ha ridimensionato dopo keepAliveTime (ciò che ottieni con una coda illimitata). Quindi, sto guardando un ThreadPoolExecutor utilizzando un LinkedBlockingQueue e il criterio CallerRuns.Perché ThreadPoolExecutor riduce i thread sotto corePoolSize dopo keepAliveTime?
Il problema che sto avendo con esso ora è che la piscina rampe su, come i documenti spiegano che dovrebbe, ma dopo i compiti completo e il KeepAliveTime entra in gioco getPoolSize mostra la piscina sempre ridotto a zero. Il codice di esempio riportato di seguito dovrebbe farvi vedere la base per la mia domanda:
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);
}
}
}
Ho trovato un vecchio bug che sembra essere il problema ma era chiuso: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6458662. Potrebbe essere ancora presente in 1.6 o mi manca qualcosa?
Sembra che io abbia gommato questo Ducati (http://www.codinghorror.com/blog/2012/03/rubber-duck-problem-solving.html). Il bug che ho linkato sopra è relativo a questo: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6576792, dove il problema sembra essere risolto in 1.7 (Ho caricato 1.7 e verificato - risolto ...). Immagino che il mio problema principale fosse che un bug questo fondamentale è rimasto per quasi un decennio. Ho passato troppo tempo a scrivere questo per non postarlo ora, spero che aiuti qualcuno.
+1 Bella scoperta, sono rimasto sorpreso di vedere questo comportamento. –
Forse sarebbe meglio strutturare il tuo post come una domanda e quindi fornire ciò che hai imparato come risposta? –