Esercizio 2
Simulare il processo di attesa di un cliente di una pizzeria che ordinata una pizza deve aspettare un tempo di preparazione di 5 secondi prima di mangiarla.
Il problema è in completa analogia con quello del processo dormiente che deve essere svegliato dopo un tempo prefissato.
class pizza{
public static void main(String[] args) {
pizzaiolo p = new pizzaiolo();
Cliente c = new Cliente(p,5000);
c.setPriority(Thread.MAX_PRIORITY);
c.start();
synchronized (p) {
p.cuoco();
System.out.println("(proprietario): mangia!");
}//fine synchronized
}//fine main
}//fine classe
class pizzaiolo {//monitor
private int tempo;
synchronized void cottura(int quanto){
tempo = quanto;
System.out.println("(pizzaiolo): è pronta fra:
" + tempo/1000 + " secondi");
try { wait();} catch(InterruptedException e) {e.printStackTrace();}
} //fine synchronized
synchronized void cuoco() {
try { Thread.sleep(tempo);
}catch(InterruptedException e) {e.printStackTrace();}
notifyAll();
System.out.println("(pizzaiolo): è pronta!");
} //fine synchronized
} //fine classe pizzaiolo
class Cliente extends Thread {
pizzaiolo s;
int attesa;
Cliente(pizzaiolo s, int attesa ) {
this.s = s;
this.attesa = attesa;
} //fine costruttore
public void run() {
s.cottura(attesa);
System.out.println("(cliente):gnam gnam....");
}//fine run
}//fine classe cliente
L'output dovrebbe apparire nel seguente modo:
(pizzaiolo): è pronta fra: 5 secondi
(pizzaiolo): è pronta!
(proprietario): mangia!
(cliente):gnam gnam....