Grazieeeeeeeeeeeeee veramente grazieeeeeeee
qualcosa è migliorato...
Questo è l'output che esce adesso:
codice:
Addetto1 aspetta...
Addetto2 aspetta...
Addetto3 aspetta...
Il Cliente18 è entrato nel supermercato.
Il Cliente18 si mette in coda nella Cassa0
Adesso la coda è di 1
Addetto1 aspetta...
Il Cliente16 è entrato nel supermercato.
Il Cliente16 si mette in coda nella Cassa1
Addetto2 aspetta...
Adesso la coda è di 1
Il Cliente1 è entrato nel supermercato.
Il Cliente1 si mette in coda nella Cassa2
Adesso la coda è di 1
Addetto3 aspetta...
Il Cliente4 è entrato nel supermercato.
Il Cliente4 si mette in coda nella Cassa0
Adesso la coda è di 2
Addetto1 sta passando i prodotti...
Il Cliente19 è entrato nel supermercato.
Il Cliente19 si mette in coda nella Cassa0
Adesso la coda è di 2
Addetto2 sta passando i prodotti...
Il Cliente8 è entrato nel supermercato.
Addetto3 aspetta...
Il Cliente8 si mette in coda nella Cassa1
Adesso la coda è di 1
Il Cliente16 è entrato nel supermercato.
Il Cliente16 si mette in coda nella Cassa1
Adesso la coda è di 2
Addetto3 sta passando i prodotti...
Il Cliente13 è entrato nel supermercato.
Il Cliente13 si mette in coda nella Cassa2
Adesso la coda è di 1
Il Cliente18 è entrato nel supermercato.
Il Cliente18 si mette in coda nella Cassa2
Adesso la coda è di 2
Il Cliente19 è entrato nel supermercato.
Il Cliente19 si mette in coda nella Cassa0
Adesso la coda è di 3
Il Cliente7 è entrato nel supermercato.
Il Cliente7 si mette in coda nella Cassa1
Adesso la coda è di 3
Il Cliente20 è entrato nel supermercato.
Il Cliente20 si mette in coda nella Cassa2
Adesso la coda è di 3
Il Cliente17 è entrato nel supermercato.
Il Cliente17 si mette in coda nella Cassa0
Adesso la coda è di 4
Il Cliente8 è entrato nel supermercato.
Il Cliente8 si mette in coda nella Cassa1
Adesso la coda è di 4
Addetto2 ha passato i prodotti e incassato.
Addetto2 sta passando i prodotti...
Il Cliente12 è entrato nel supermercato.
Il Cliente12 si mette in coda nella Cassa1
Adesso la coda è di 4
Il Cliente19 è entrato nel supermercato.
Il Cliente19 si mette in coda nella Cassa2
Adesso la coda è di 4
Il Cliente5 è entrato nel supermercato.
Il Cliente5 si mette in coda nella Cassa0
Adesso la coda è di 5
Il Cliente3 è entrato nel supermercato.
Il Cliente3 si mette in coda nella Cassa1
Adesso la coda è di 5
Il Cliente20 è entrato nel supermercato.
Il Cliente20 si mette in coda nella Cassa2
Adesso la coda è di 5
Il Cliente9 ha notato che tutte le code sono piene, quindi, attende...
Il Cliente10 ha notato che tutte le code sono piene, quindi, attende...
Addetto2 ha passato i prodotti e incassato.
Addetto2 sta passando i prodotti...
Addetto1 ha passato i prodotti e incassato.
Addetto1 sta passando i prodotti...
Il Cliente6 è entrato nel supermercato.
Il Cliente6 si mette in coda nella Cassa0
Adesso la coda è di 5
Il Cliente9 è entrato nel supermercato.
Il Cliente1 è entrato nel supermercato.
Il Cliente1 si mette in coda nella Cassa1
Adesso la coda è di 5
Il Cliente10 è entrato nel supermercato.
Il Cliente17 ha notato che tutte le code sono piene, quindi, attende...
Il Cliente3 ha notato che tutte le code sono piene, quindi, attende...
Il Cliente5 ha notato che tutte le code sono piene, quindi, attende...
Il Cliente13 ha notato che tutte le code sono piene, quindi, attende...
Il Cliente15 ha notato che tutte le code sono piene, quindi, attende...
Il Cliente2 ha notato che tutte le code sono piene, quindi, attende...
Il Cliente7 ha notato che tutte le code sono piene, quindi, attende...
Addetto3 ha passato i prodotti e incassato.
Il Cliente11 ha notato che tutte le code sono piene, quindi, attende...
Addetto3 sta passando i prodotti...
Il Cliente14 è entrato nel supermercato.
Il Cliente14 si mette in coda nella Cassa2
Adesso la coda è di 5
Il Cliente17 è entrato nel supermercato.
Il Cliente18 ha notato che tutte le code sono piene, quindi, attende...
Il Cliente17 ha notato che tutte le code sono piene, quindi, attende...
Il Cliente20 ha notato che tutte le code sono piene, quindi, attende...
Il Cliente14 ha notato che tutte le code sono piene, quindi, attende...
Addetto3 ha passato i prodotti e incassato.
Addetto3 sta passando i prodotti...
Noto che qualcosa non funzioni ancora bene...o sbaglio? penso sia il nuovo metodo incassa()
Questo è il codice della classe supermercato mettendo il controllo subito nel metodo paga(),
ho aggiornato il metodo incassa()
codice:
//Classe Supermercato condivisa tra tutti i thread clienti e addetti
public class Supermercato {
static int MAX_CASSE;//indica il numero massimo di casse disponibili
private int MAX_CODA;//indica la coda massima di ongni singola coda
private int MIN_CODA; //varibile dove il metodo scegliCassa inserisce il numero minore di clienti tra tutte le code
private Cassa casse[]; //creo un array di tipo Cassa
//----------------------------------------------------COSTRUTTORE---------------------------------------------------------------
public Supermercato(){
MAX_CASSE=3;//inizializzazione max_casse
MIN_CODA=0;//inizializzo la min_coda
MAX_CODA=5;//inizializzaziond max_coda
casse = new Cassa[MAX_CASSE];//inizializzo l'array formato da 3 celle
//inizializzazione casse tramite costruttore
for(int i=0; i<casse.length; i++){
casse[i] = new Cassa(0, true, "Cassa"+i);//inizializzo a zero la coda poi a true la cassa e gli passo un nome
}//fine for
}//fine costruttore
//------------------------------------------------------METODI------------------------------------------------------------------
//questo metodo permette la scelta della cassa migliore, quindi con minor numero di clienti in coda-----------------------------
public String scegliCassa() {
if( casse[0].get_coda() <= casse[1].get_coda() ){
if( casse[0].get_coda() <= casse[2].get_coda() ){
MIN_CODA = casse[0].get_coda();
return casse[0].get_nome();
}else{
MIN_CODA = casse[2].get_coda();
return casse[2].get_nome();
}//fine else interno
}else if(casse[1].get_coda() <= casse[2].get_coda() ){
MIN_CODA = casse[1].get_coda();
return casse[1].get_nome();
}else{
MIN_CODA = casse[2].get_coda();
return casse[2].get_nome();
}//fine else esterno
}//fine metodo scegliCassa
//questo metodo aggiunge un cliente alla coda, incrementando l'opportuna variabile--------------------------------------
public synchronized void paga(){
String cassaScelta = scegliCassa();
//Controlla subito se tutte le code sono piene, il cliente deve essere messo in wait() subito
while ( MIN_CODA == 5) {
// Finchè le code sono tutte piene, mi metto in wait
System.out.println("Il " + Thread.currentThread().getName() + " ha notato che tutte le code sono piene, quindi, attende...");
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}//fine catch
}//fine while
System.out.println("Il " + Thread.currentThread().getName() + " è entrato nel supermercato.");
//System.out.printf("la funzone sceltaCassa ha scelto la %s\n", cassaScelta);
for(int i=0; i<casse.length; i++){
//System.out.printf("entro nel ciclo: %d\n",i);
//se il nome della cassa(i) è uguale al nome ritornato dal metodo scegliCassa, la coda è minore di 5,
// e lo stato della cassa è true(aperta) il thread si mette in coda nella cassa con minor numero di clienti(thread)
if( casse[i].get_nome().equals(cassaScelta) && (casse[i].get_coda()<MAX_CODA) && (casse[i].get_statoCassa()==true) ){
System.out.println("Il " + Thread.currentThread().getName() + " si mette in coda nella " + casse[i].get_nome());
notify();//mando un signal di risveglio agli addetti
casse[i].set_coda(1);//incrementa la coda
System.out.printf("Adesso la coda è di %d\n", casse[i].get_coda());
break;
}//fine if
//System.out.printf("ciclo n: %d\n",i);
}//fine for
}//fine metodo paga
//questo metodo elimina un cliente dlla coda, decrementando l'opportuna variabile--------------------------------------
public synchronized void incassa(){
String cassaScelta = scegliCassa();
//finchè tutte le casse sono vuote l'addetto si mette in waitng aspettando un cliente che manda un signal di notify
while(MIN_CODA == 0){
System.err.println(Thread.currentThread().getName() + " aspetta...");
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}//fine catch
}//fine while
//il thread(addetto) che entra in questa sezione decrementa la propria coda.
if(Thread.currentThread().getName().equals("Addetto1") && casse[0].get_coda() > 0){
System.err.println(Thread.currentThread().getName() + " sta passando i prodotti...");
casse[0].set_coda(-1);
}else if(Thread.currentThread().getName().equals("Addetto2") && casse[1].get_coda() > 0){
System.err.println(Thread.currentThread().getName() + " sta passando i prodotti...");
casse[1].set_coda(-1);
}else if(Thread.currentThread().getName().equals("Addetto3") && casse[2].get_coda() > 0){
System.err.println(Thread.currentThread().getName() + " sta passando i prodotti...");
casse[2].set_coda(-1);
}else{
System.err.println(Thread.currentThread().getName() + " aspetta...");
try {
//Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}//fine catch
}//fine else
}//fine metodo incassa
}//fine classe supermercato