Ci sono 4 squadre contrassegnate dai colori Rosso, Bianco, Verde, Blu, codificati con i numeri da 0 a 3. Ogni squadra è composta da numComponenti giocatori, identificati con in numeri da 0 a numComponenti-1.
Le squadre devono cercare di entrare in una porta prima delle altre seguendo le regole seguenti:
- nessun giocatore deve entrare prima che la porta sia stata aperta dal thread principale (
main) tramite l’invocazione del metodoporta.apri(). A tale scopo i thread invocano il metodoporta.attendi(); - solo il capitano della squadra (giocatore con id 0) compete con gli altri capitani per l’accesso alla porta ( metodo
porta.entra(...)); - quando un capitano riesce ad entrare tutti i giocatori della sua squadra possono entrare ( sempre metodo
porta.entra(...)) ma devono entrare in fila:1,2,3, ... , numComponenti-1 - mentre una squadra entra le altre squadre attendono. Solo quando tutta la squadra è entrata i capitani possono di nuovo competere per la porta.
L’output atteso dovrebbe essere il seguente: Tutti i giocatori vengono creati e stampano a video che sono pronti (notare che una sleep ‘mescola’ l’ordine dei giocatori). Quando la porta viene aperta, le varie squadre entrano nella porta una alla volta. Ad esempio:
La porta e' aperta!!
Componente Blu numero 0 e' entrato!
Componente Blu numero 1 e' entrato!
Componente Blu numero 2 e' entrato!
Componente Blu numero 3 e' entrato!
Componente Blu numero 4 e' entrato!
Componente Blu numero 5 e' entrato!
Componente Blu numero 6 e' entrato!
Componente Blu numero 7 e' entrato!
Componente Blu numero 8 e' entrato!
Componente Blu numero 9 e' entrato!
Componente Rosso numero 0 e' entrato!
Componente Rosso numero 1 e' entrato!
Componente Rosso numero 2 e' entrato!
Componente Rosso numero 3 e' entrato!
Componente Rosso numero 4 e' entrato!
Componente Rosso numero 5 e' entrato!
Componente Rosso numero 6 e' entrato!
Componente Rosso numero 7 e' entrato!
Componente Rosso numero 8 e' entrato!
Componente Rosso numero 9 e' entrato!
Componente Verde numero 0 e' entrato!
Componente Verde numero 1 e' entrato!
...
L’ordine dei colori varia da un’esecuzione all’altra in quanto dipende da quale capitano è più veloce.
Scopo della esercitazione è implementare il monitor ‘Porta’ con i tre metodi sopra descritti. Utilizzare il seguente programma di test:
import java.lang.Math;
public class Test extends Thread {
private static final String colori[]={"Rosso","Bianco","Verde","Blu"}; // colori
private static final int numColori = colori.length; // quanti colori/squadre ci sono
private static final int numComponenti =10; // numero componenti
private final int col, num; // colore e numero del giocatore
private final Porta porta; // monitor utlizzato dal giocatore
// costruttore: salva colore numero e monitor
Test(int col,int num, Porta porta) {
this.col = col;
this.num = num;
this.porta = porta;
}
// lancia il codice vero e proprio e cattura l'eccezione di interruzione
public void run() {
try {
code();
} catch (InterruptedException e) {
System.out.println("Componente "+colori[col]+" numero "+num+" interrotto!!");
}
}
// codice dei thread
void code() throws InterruptedException {
// evita che i thread siano gia' in fila
sleep((int)(1000*Math.random()));
// il giocatore e' pronto
System.out.println("Componente "+colori[col]+" numero "+num+" pronto!");
// attende che la porta venga aperta dal main
porta.attendi();
// cerca di entrare
porta.entra(col,num);
// attenzione che questo output non e' sincronizzato con entra.... quindi non e' detto
// che venga stampato nell'ordine corretto. Aggiungere un blocco synchonized(porta){ }
// se necessario
System.out.println("Componente "+colori[col]+" numero "+num+" e' entrato!");
}
public static void main(String argv []) throws InterruptedException {
int i,j;
Porta p = new Porta(numComponenti); // crea il monitor
// crea i thread dei vari colori/numeri
for (i=0; i<numColori; i++)
for (j=0; j<numComponenti; j++) {
(new Test(i,j,p)).start();
}
// attende 3 secondi prima di aprire la porta (tutti i thread devono attendere)
sleep(3000);
p.apri();
System.out.println("La porta e' aperta!!");
}
}