Sembra impossibile creare un pool di thread nella cache con un limite al numero di thread che può creare.
Ecco come viene implementato Executors.newCachedThreadPool statico nella libreria Java standard:
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
Quindi, usando quel modello per continuare a creare un pool di thread nella cache di dimensioni fisse:
new ThreadPoolExecutor(0, 3, 60L, TimeUnit.SECONDS, new SynchronusQueue<Runable>());
Ora se lo usi e invii 3 attività, tutto andrà bene. L'invio di ulteriori attività comporterà eccezioni di esecuzione rifiutate.
Provando questo:
new ThreadPoolExecutor(0, 3, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue<Runable>());
Il risultato sarà l'esecuzione sequenziale di tutti i thread. Vale a dire, il pool di thread non realizzerà mai più di un thread per gestire le attività.
Questo è un bug nel metodo di esecuzione di ThreadPoolExecutor? O forse questo è intenzionale? O c'è un altro modo?
Modifica: voglio qualcosa di simile al pool di thread nella cache (crea thread su richiesta e poi li uccide dopo un certo timeout) ma con un limite al numero di thread che può creare e la possibilità di continuare a mettere in coda attività aggiuntive una volta che ha ha raggiunto il limite del thread. Secondo la risposta di Sjlee questo è impossibile. Guardando il metodo execute () di ThreadPoolExecutor è davvero impossibile. Avrei bisogno di sottoclassare ThreadPoolExecutor e sovrascrivere execute () in qualche modo come fa SwingWorker, ma ciò che SwingWorker fa nel suo execute () è un hack completo.