edutecnica

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