Salve,
a lezione non ho ancora parlato di questo costruttore, che ha un comportamento più complesso di quelli introdotti a lezione.
I comportamenti che lei descrive sono entrambe corretti, rispetto ai parametri del threadpool che lei ha impostato, ma non soddisfano i requisiti dell'esercizio.
Infatti:
- se utilizza
new ThreadPoolExecutor(1, 4, 10, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(capienzaSecondaStanza));
il numero di "sportelli" rimane sempre 1, perchè il core contiene un solo thread. Gli altri 3 thread del pool vengono attivati solo se, quando arriva un task, questo thread sta lavorando e la coda è piena. Evidentemente, questa situazione non si verifica mai nel suo programma, a causa dei tempi di interarrivo nella seconda stanza.
se utilizza new ThreadPoolExecutor(4, 4, 10, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(capienzaSecondaStanza)); tutti i thread che attiva fanno parte del core ed i thread del core, per default, non vengono mai disattivati.
possibile soluzione: utilizzare new ThreadPoolExecutor(4, 4, 10, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(capienzaSecondaStanza)), ma utilizzare anche il metodo prestartAllCoreThreads(), per attivare tutti i thread subito, non on demand (per simulare meglio lo scenario di un ufficio postale) ed i metodi setKeepAliveTime e allowCoreThreadTimeOut(boolean), per settare un time-out anche per i core thread.
Laura Ricci