Esiste una soluzione alternativa a questo problema. Si consideri il seguente implementazione:
int corePoolSize = 40;
int maximumPoolSize = 40;
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize,
60L, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
threadPoolExecutor.allowCoreThreadTimeOut(true);
Impostando il allowCoreThreadTimeOut() di true
, i fili nel pool possono terminare dopo il timeout specificato (60 secondi in questo esempio). Con questa soluzione, è l'argomento del costruttore corePoolSize
che determina la dimensione massima del pool in pratica, poiché il pool di thread crescerà fino a corePoolSize
e quindi inizierà ad aggiungere lavori alla coda. È probabile che il pool non possa mai diventare più grande di così, perché il pool non genera nuovi thread fino a quando la coda è piena (il che, dato che lo LinkedBlockingQueue
ha una capacità Integer.MAX_VALUE
non può mai accadere).Di conseguenza, non ha molto senso impostare maximumPoolSize
su un valore superiore a corePoolSize
.
Considerazione: il pool di thread ha 0 thread inattivi dopo che è scaduto il timeout, il che significa che ci sarà un po 'di latenza prima della creazione dei thread (normalmente, si avranno sempre thread corePoolSize
disponibili).
Ulteriori dettagli sono disponibili nel JavaDoc di ThreadPoolExecutor.
Correlato a http://stackoverflow.com/questions/19528304/how-to-get-the-threadpoolexecutor-to-infrease-threads-to-max-before-queueing/19528305#19528305 – Gray