Esercizio 4
Realizza un programma che simuli l'attività di 10 automobili che utilizzano
un parcheggio di 5 posti; se il parcheggio è totalmente occupato le eventuali
auto che vogliono entrare devono essere messe in attesa (wait) circolando
per un tempo massimo di 20 secondi.
Le auto in attesa devono ritentare l'ingresso appena si libera un posto
(notify).
Ogni auto può restare parcheggiata solo per un tempo massimo di 10 secondi.
public class parco
{
public static void main(String[] args){
Parcheggio park = new Parcheggio(5);
for (int i=1; i<= 10; i++) {
Macchina c = new Macchina("Auto "+i, park);}
} //fine main
} //fine classe
class Parcheggio { //monitor
public int posti;
public Parcheggio(int posti) {this.posti= posti;}
public synchronized void entra() { // entra
nel parcheggio
while (posti==0) {
try {wait();
}catch (InterruptedException e) {e.printStackTrace();}
} //fine while
posti--;
} //fine synchronized
public synchronized void esce() { // esce
dal parcheggio
posti++;
notifyAll();
} //fine synchronized
} //fine classe parcheggio
class Macchina extends Thread {
private Parcheggio park;
public Macchina(String nome, Parcheggio p) { //costruttore
super(nome);
this.park = p;
start();
}
public void run() {
while (true) {
try { sleep((int)(Math.random() * 20000)); //
guida prima del parcheggio
} catch (InterruptedException e) {e.printStackTrace();} synchronized(park){
park.entra();
System.out.println(getName()+": è entrata liberi:"+park.posti);
} //fine synchronized
try { sleep((int)(Math.random() * 10000)); //
tempo di parcheggio
} catch (InterruptedException e) {e.printStackTrace();} synchronized(park){
park.esce();
System.out.println(getName()+": è uscita liberi:"+park.posti);
} //fine synchronized
} //fine while
} //fine run
} //fine classe macchina
L'output dovrebbe apparire nel seguente modo:
Auto 1: è entrata liberi:4
Auto 8: è entrata liberi:3
Auto 5: è entrata liberi:2
Auto 1: è uscita liberi:3
Auto 6: è entrata liberi:2