Advertisement
LeonidR

Incrocio

Mar 31st, 2015
271
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.93 KB | None | 0 0
  1. public class Incrocio {
  2.  
  3.     /*
  4.         L'idea è quella di avere un semaforo con quattro stati, descritto di seguito.
  5.         ogni volta che una macchina vuole attraversare l'incrocio verifica il semaforo,
  6.         se ha il semaforo rosso deve aspettare, altrimenti può proseguire.
  7.  
  8.         la seconda parte è sincronizzare le macchine in modo da non farli scontrare,
  9.         quindi devo aspettare che si liberi la posizione in cui voglio muovermi se è occupata.
  10.  
  11.         i metodi synchronized mi fanno eseguirli in mutuaesclusione
  12.         la wait puoi generare l'eccezione InterruptedException
  13.     */
  14.  
  15.     int DIM;
  16.     char[][] strada;
  17.  
  18.     int semaforo = 0; //ha quatro stati:
  19.     /*
  20.         formato: (orizzontale verticale)
  21.         0 - rosso rosso
  22.         1 - rosso verde
  23.         2 - rosso rosso
  24.         3 - verde rosso
  25.     */
  26.         //inizialmente il semaforo è rosso per tutti quindi stato 0
  27.  
  28.     /*
  29.      * Costruttore: genera la strada e la inizializza con spazi
  30.      * *** Non modificare ***
  31.      */
  32.     public Incrocio(int DIM) {
  33.         int i,j;
  34.         this.DIM = DIM;
  35.         this.strada = new char[DIM][DIM];
  36.         for (i=0;i<DIM;i++)
  37.             for (j=0;j<DIM;j++)
  38.                 strada[i][j] = ' ';
  39.     }
  40.  
  41.     /*
  42.      * Restituisce il carattere alle coordinate x,y
  43.      * *** Non modificare ***
  44.      */
  45.     public char strada(int x, int y) {
  46.         return strada[x][y];
  47.     }
  48.  
  49.     /*
  50.      * Aggiungere codice per gestire la sincronizzazione
  51.      */
  52.     public synchronized void muovi(char c, int x, int y, int dx, int dy) throws InterruptedException {
  53.         while(strada[x+dx][y+dy] != ' ') //aspetto affinche' non ho lo spazio per muovermi
  54.             wait(); //una volta che ce l'ho mi muovo e libero la posizione occupata in precedente
  55.  
  56.         if (strada[x+dx][y+dy] != ' ')
  57.             strada[x+dx][y+dy] = '*'; // questo non dovrebbe accadere quando si sincronizzano!
  58.         else
  59.             strada[x+dx][y+dy] = c;
  60.         libera(x,y);
  61.     }
  62.  
  63.     /*
  64.      * Aggiungere codice per gestire la sincronizzazione
  65.      */
  66.     public synchronized void libera(int x, int y) {
  67.         strada[x][y] = ' ';
  68.         notifyAll(); //una volta che ho liberato lo spazio notifico a tutti che l'ho liberato
  69.         //in modo che se qualcuno mi stava aspettando si possa muovere
  70.     }
  71.  
  72.     public synchronized void semaforo(Boolean d) throws InterruptedException {
  73.         //assumo che quando d è true la macchina si muove in orizzontale
  74.         while((d && semaforo != 3) || (!d && semaforo != 1)) //se il mio semaforo è rosso aspetto
  75.             wait();
  76.  
  77.         //quando d è true significa che voglio spostami orizzontalmente quindi posso farlo solo
  78.         //quando il semaforo è 3: (verde rosso), formato (orizzontale verticale)
  79.  
  80.         //simetricamente per il caso quando voglio spostarmi verticalmente:
  81.         //aspetto fino a quando il semaforo diventi 1 (rosso verde), formato (orizzontale verticale)
  82.     }
  83.  
  84.     public synchronized void cambiaSemaforo() {
  85.         semaforo = (semaforo+1)%4;
  86.         //il semaforo a 4 stati: da 0 a 3 quindi il modulo mi garantisce di ciclare tra i stati disponibili
  87.         // Notifico tutti che ho cambiato il semaforo, quindi sblocco quelli che aspettavano per il caso semaforo
  88.         notifyAll();
  89.     }
  90. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement