Advertisement
Guest User

incrocio

a guest
Apr 1st, 2015
255
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.27 KB | None | 0 0
  1. /*
  2.  * Ci sono N_AUTO automobili che si approcciano a un incrocio regolato da semaforo, da 4 direzioni.
  3.  * Le auto si comportano secondo il seguente schema:
  4.  *
  5.  ********
  6.  *  finche' sulla strada:
  7.  *
  8.  *      Se all'incrocio:
  9.  *          incr.semaforo(direzione); // direzione=true o false a seconda se orizzontale o verticale
  10.  *             
  11.  *      incr.muovi(c,x,y,dx,dy); // la macchina si muove se la strada e' libera
  12.  *      x+=dx; y+=dy;
  13.  *     
  14.  *      incr.libera(x,y); // esce dall'incrocio
  15.  *********
  16.  *
  17.  * Progettare un monitor Incrocio che implementi i seguenti metodi:
  18.  *
  19.  * void muovi(char c, int x, int y, int dx, int dy)
  20.  *   se la posizione x+dx,y+dy e' occupata attende. Altrimenti scrive c in tale posizione e libera
  21.  *   la posizione attuale x,y invocando libera(x,y) (vedere sotto)
  22.  *
  23.  * void libera(int x, int y)
  24.  *   libera la posizione x,y scrivendo uno spazio (viene invocata quando le auto escono dall'incrocio)
  25.  *
  26.  * void semaforo(Boolean d)
  27.  *   e' il semaforo nell'incrocio. viene invocato con un booleano che indica la direzione
  28.  *   (orizzontale o verticale). Il semaforo puo' essere verde in una direzione o rosso per entrambe
  29.  *   se il semaforo e' rosso per la direzione d la macchina attende
  30.  *
  31.  * void cambiaSemaforo()
  32.  *   viene invocata periodicamente e cambia lo stato del semaforo. Il semaforo deve 'ciclare' tra
  33.  *   quattro stati: rosso per tutti, verde in una direzione, rosso per tutti, verde nell'altra direzione
  34.  */
  35. public class Incrocio {
  36.     int DIM;
  37.     char[][] strada;
  38.     int stato=3;
  39.  
  40.     /*
  41.      * Costruttore: genera la strada e la inizializza con spazi
  42.      * *** Non modificare ***
  43.      */
  44.     public Incrocio(int DIM) {
  45.         int i,j;
  46.         this.DIM = DIM;
  47.         this.strada = new char[DIM][DIM];
  48.         for (i=0;i<DIM;i++)
  49.             for (j=0;j<DIM;j++)
  50.                 strada[i][j] = ' ';
  51.     }
  52.  
  53.     /*
  54.      * Restituisce il carattere alle coordinate x,y
  55.      * *** Non modificare ***
  56.      */
  57.     public char strada(int x, int y) {
  58.         return strada[x][y];
  59.     }
  60.  
  61.     /*
  62.      * Aggingere codice per gestire la sincronizzazione
  63.      */
  64.     public synchronized void muovi(char c, int x, int y, int dx, int dy) {
  65.    
  66.          
  67.          while(strada[x+dx][y+dy] != ' ')
  68.             try{ this.wait(); }catch(InterruptedException e) {
  69.                     System.out.println(" Ah mi hanno interrotto!!");
  70.                 }//catch end
  71.            
  72.                
  73.       /*
  74.          * Controlla che non ci sia un incidente, scrive c sulla strada e libera la
  75.          * posizione attuale. Non modificare
  76.          */
  77.         if (strada[x+dx][y+dy] != ' ')
  78.             strada[x+dx][y+dy] = '*'; // questo non dovrebbe accadere quando si sinconizzano!
  79.         else
  80.             strada[x+dx][y+dy] = c;
  81.         libera(x,y);
  82.         /****************************************************************************/
  83.     }
  84.  
  85.     /*
  86.      * Aggiungere codice per gestire la sincronizzazione
  87.      */
  88.     public synchronized void libera(int x, int y) {
  89.         strada[x][y] = ' ';
  90.         notifyAll();
  91.     }
  92.  
  93.     public synchronized void semaforo(Boolean d) {
  94.        
  95.         boolean possopassare=false;
  96.        
  97.         while(!possopassare){
  98.             try{ this.wait(); }catch(InterruptedException e) {
  99.                         System.out.println(" Ah mi hanno interrotto!!");
  100.                     }//catch end
  101.            //possopassare=false;
  102.             if((stato==0)&&d)possopassare=true;
  103.             else if((stato==2)&&!d)possopassare=true;
  104.             notifyAll();
  105.         }
  106.                
  107.     }
  108.  
  109.     public synchronized void cambiaSemaforo() {
  110.    
  111.         stato=(stato+1)%4;
  112.         notifyAll();
  113.     }
  114. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement