[monitor] Poste

La verifica consiste nell’implementazione di un monitor CodaPoste per la sincronizzazione di un certo numero di thread Persone. I thread Persone rappresentano gli utenti di un ufficio postale con N_SPORTELLI sportelli. La coda di attesa agli sportelli è unica: le persone si mettono in fila e quando è il loro turno vanno al primo sportello libero.

Un thread Persona si comporta come segue:

Thread Persona {
    while( in coda ) {
        // si muove in coda
        p.move(x, y, newx, newy); // si muove da x,y a newx,newy
    }

    // attendi il primo sportello libero e lo occupa
    sportello = p.attendiSportello(); 
    
    while( non hai raggiunto lo sportello ) {
        p.move(x, y, newx, newy); // si muove da x,y a newx,newy
    }

    // attendi di essere servito (sleep)

    // libera lo sportello
    p.liberaSportello(sportello); 

    // esce dall'ufficio postale
    p.libera(x, y);
}

I metodi del monitor che dovete implementare sono i seguenti:

// si muove da x,y a nx,ny. Se nx,ny è occupato attende altrimenti
// occupa nx,ny e libera x,y.
public synchronized void move(int x, int y, int nx, int ny) throws InterruptedException {
}

// libera la posizione x,y (invocata quando l'utente esce dall'ufficio)
public synchronized void libera(int x, int y) {
}

// La persona è la prossima ad essere servita e attende che si liberi uno sportello.
// Nel caso ci sia almeno uno sportello libero, occupa il primo disponibile e ne
// ritorna l'indice.
public synchronized int attendiSportello() throws InterruptedException {
   return 0; // da modificare opportunamente
}

// La persona ha raggiunto lo sportello, ha fruito del servizio e ora lo libera
public synchronized void liberaSportello(int id) {
}

Scaricate la verifica da qui e modificate il file CodaPoste.java. Per compilare ed eseguire il programma, usate i seguenti comandi:

> javac Poste.java
> java Poste

NOTA BENE

  • Consegnate solo il file CodaPoste.java;
  • Commentate in maniera appropriata il vostro programma: in particolare, inserite un commento iniziale in cui spiegate l’idea risolutiva. Soluzioni non commentate NON saranno valutate.
  • NON COPIATE!!!