Assignment Discussion

Simulazione Ufficio postale: pool di thread variabile

Simulazione Ufficio postale: pool di thread variabile

by SIMONE ANILE -
Number of replies: 1

Buongiorno,

sto cercando di completare la versione facoltativa del secondo esercizio ma ho un problema con il pool di thread.
Uso

secondaStanza = new ThreadPoolExecutor(1, 4, 10, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(capienzaSecondaStanza));

ma il numero di "sportelli" sembra rimanere sempre 1.

Se invece uso
secondaStanza = new ThreadPoolExecutor(4, 4, 10, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(capienzaSecondaStanza));

al bisogno vengono creati fino a 4 thread ma non vengono più terminati.
Sto sbagliando qualcosa nella creazione del pool?

Grazie

In reply to SIMONE ANILE

Re: Simulazione Ufficio postale: pool di thread variabile

by Laura Ricci -

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. 

spero di essermi spiegata....

Laura Ricci