Forum: Dubbi e domande sugli esercizi

Parte Facoltativa Assignment ufficio postale

Parte Facoltativa Assignment ufficio postale

di FEDERICO ERRICA -
Numero di risposte: 5

Ho un dubbio riguardante l'effettiva chiusura degli sportelli dopo un certo intervallo di tempo:

- Usando un fixed thread pool non si può impostare il tempo dopo cui gli sportelli chiudono, la coda è illimitata e i core thread non chiudono

- Usando un threadPoolExecutor e un ArrayBlockingQueue di k elementi:

         - Con minCore = 0 e maxCore = 4 all'avvio gli sportelli non si aprono fintanto che la coda non si riempie

         - Con minCore = 4 e maxCore = 4 gli sportelli non si chiudono mai

- Usando un threadPoolExecutor e una SynchronousQueue funziona MA devo esplicitamente gestire la seconda stanza di k clienti

Credo siano tutte le possibilità, qualcuno ha risolto in maniera diversa? Perché in questo modo mi sembra che non sia possibile rispettare la specifica dell'esercizio.


In riposta a FEDERICO ERRICA

Re: Parte Facoltativa Assignment ufficio postale

di MARCO CATAPANO -

"- Usando un threadPoolExecutor e un ArrayBlockingQueue di k elementi:
         - Con minCore = 0 e maxCore = 4 all'avvio gli sportelli non si aprono fintanto che la coda non si riempie

         - Con minCore = 4 e maxCore = 4 gli sportelli non si chiudono mai"

Dovrebbe essere possibile, a runtime, settare le variabili relative al numero minimo (e massimo) di thread: infatti si può invocare il metodo setCorePoolSize() per poter modificare il valore minimo del pool dei thread.

Per avere tutti gli sportelli operativi all'inizio, potresti inizializzare il ThreadPoolExecutor con CorePoolSize di valore uguale al MaxCoreSize per poi invocare il metodo prestartAllCoreThreads(): così dovresti avere tutti i Thread già attivi. Subito prima che inizi ad arrivare la gente all'ufficio postale, invochi il metodo setCorePoolSize() con il valore che vuoi (0, in questo caso è ciò che si vuole).
In poche parole è come "unire" i due casi che hai citato: ti servono che siano tutti operativi dall'inizio (inizializzo con CorePoolSize = MaxPoolSize), ma vuoi anche che tutti i threads terminino in caso di inattività (imposto CorePoolSize = 0).

In riposta a MARCO CATAPANO

Re: Parte Facoltativa Assignment ufficio postale

di FEDERICO ERRICA -

Grazie, non pensavo si potesse ridurre il core number successivamente :)

In riposta a FEDERICO ERRICA

Re: Parte Facoltativa Assignment ufficio postale

di FEDERICO ERRICA -
La documentazione di setCorePoolSize dice:


Sets the core number of threads. This overrides any value set in the constructor. If the new value is smaller than the current value, excess existing threads will be terminated when they next become idle. If larger, new threads will, if needed, be started to execute any queued tasks.

Se quel "when they next become idle" potrebbe accadere che essi vengano sospesi immediatamente?

In tal caso, si tornerebbe al caso precedente di  min = 0 e max = 4

In riposta a FEDERICO ERRICA

Re: Parte Facoltativa Assignment ufficio postale

di MARCO CATAPANO -

Per quel poco che ho testato, sembrava che non me li chiudesse subito. Non so se con "become idle" intenda "quando hanno raggiunto il keepAliveTime", oppure (che sarebbe un po' più plausibile) "quando non stanno facendo task".

In questo caso, penso che runnare del codice per monitorare in qualche modo lo stato dei thread non sia una pessima idea.

In riposta a FEDERICO ERRICA

Re: Parte Facoltativa Assignment ufficio postale

di MARCO CATAPANO -

Per quel poco che ho testato, sembrava che non me li chiudesse subito. Non so se con "become idle" intenda "quando hanno raggiunto il keepAliveTime", oppure (che sarebbe un po' più plausibile) "quando non stanno facendo task".

In questo caso, penso che runnare del codice per monitorare in qualche modo lo stato dei thread non sia una pessima idea.