Advertisement
Guest User

Untitled

a guest
Feb 20th, 2019
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.73 KB | None | 0 0
  1. /* ESEMPIO GESTORE VOLO*/
  2.  
  3. /* ************** Classe Cliente *************** */
  4.  
  5. public class Cliente extends Thread {
  6.  
  7.   private Gestore g;
  8.  
  9.   public Cliente(Gestore g) {
  10.     this.g = g;
  11.   }
  12.  
  13.   public void run(){
  14.     try {
  15.       g.seleziona(this, "AB1234");
  16.       System.out.println("Volo selezionato");
  17.       boolean r = g.prenota(this, 1, 'A');
  18.       System.out.println("Prenotazione: " + r);
  19.       sleep(2000);
  20.       g.deseleziona(this);
  21.     } catch (InterruptedException ie) {
  22.       System.err.println(ie.getMessage());
  23.     } catch (VoloNonSelezionatoException vn) {
  24.       System.err.println(vn.getMessage());
  25.     } catch (VoloNonEsistenteException ne) {
  26.       System.err.println(ne.getMessage());
  27.     }
  28.   }
  29. }
  30.  
  31. /* **************** Classe Gestore *************** */
  32.  
  33.  
  34. public class Gestore {
  35.  
  36.   /* Associa i codici ai voli. */
  37.   private Map <String, Volo> lv = new HashMap<String, Volo>();
  38.  
  39.   /* Associa agli utenti il volo che hanno selezionato. */
  40.   private Map<Cliente, Volo> tm = new HashMap<Cliente, Volo>();
  41.  
  42.   /**
  43.    * Crea un gestore.
  44.    * Suppongo che il gestore venga creato prima che i clienti inizino a lavorarci sopra.
  45.    * Non c'è quindi un problema di corse critiche nell'accesso a lv.
  46.    */
  47.   public Gestore(String[] data){
  48.     for(String c: data) {
  49.       lv.put(c, new Volo());
  50.     }
  51.   }
  52.  
  53.   /**
  54.    * Il cliente x seleziona il volo indicato dal codice c.
  55.    */
  56.   public void seleziona(Cliente x, String c) throws InterruptedException, VoloNonEsistenteException {
  57.    
  58.     // Trova l'oggetto volo associato al codice in questione.
  59.     Volo v = find(c);
  60.  
  61.     // Un volo con tale codice non è stato trovato.
  62.     if(v == null)
  63.       throw new VoloNonEsistenteException();
  64.  
  65.     // Sincronizzazione sull'oggetto volo.
  66.     synchronized(v) {
  67.  
  68.       // Se selezionato già da tre clienti mi blocco.
  69.       while(v.getNumeroClienti() >= 3)
  70.         v.wait();
  71.  
  72.       // Incremento il contatore che tiene traccia del numero di clienti che hanno
  73.       // selezionato questo volo.
  74.       v.nuovoCliente();
  75.  
  76.       // Associo il volo selezionato all'utente.
  77.       // Serve per prenotazioni successive.
  78.       inserisci(x, v);
  79.     }
  80.   }
  81.  
  82.   /**
  83.    * Rimuove selezione precedentemente eseguita dall'utente
  84.    */
  85.   public void deseleziona(Cliente x) {
  86.  
  87.     // Rimuove il cliente dalla map.
  88.     // Viene restutuito il volo precedentemente selezionato.
  89.     Volo v = rimuovi(x);
  90.  
  91.     // Se null: l'utente non aveva selezionato nessun volo.
  92.     // Se diverso da null: decremento il contatore di clienti associati al volo
  93.     // e risveglio eventuali bloccati.
  94.     if(v != null)
  95.         synchronized(v) {
  96.             v.clienteDeseleziona();
  97.             v.notify();
  98.         }
  99.   }
  100.  
  101.   /**
  102.    * Il cliente x prenota il posto indicato da row e seat
  103.    */
  104.   public boolean prenota(Cliente x, int row, char seat)
  105.           throws IllegalArgumentException, VoloNonSelezionatoException {
  106.  
  107.     // Ottengo il volo selezionato in precedenza dall'utente.
  108.     Volo v = getVolo(x);
  109.    
  110.     // Se l'utente non aveva selezionato nessun volo lancio eccezione.
  111.     if(v == null)
  112.       throw new VoloNonSelezionatoException();
  113.        
  114.     // Esegue prenotazione vera e propria sull'oggetto volo.  
  115.     synchronized(v) {
  116.       return v.prenota(row, seat);
  117.     }
  118.   }
  119.  
  120.   /**
  121.    * Restituisce il volo associato al codice c
  122.    */
  123.   private Volo find(String c) {
  124.     synchronized(tm) {
  125.       return lv.get(c);
  126.     }
  127.   }
  128.  
  129.   /**
  130.    * Il cliente ha selezionato il volo.
  131.    * Inserisco associazione della tabella.
  132.    */
  133.   private void inserisci(Cliente x, Volo v) {
  134.     synchronized(tm) {
  135.       tm.put(x, v);
  136.     }
  137.   }
  138.  
  139.   /**
  140.    * Il cliente ha deselezionato un volo.
  141.    * Rimuovo associazione dalla tabella.
  142.    */
  143.   private Volo rimuovi(Cliente x) {
  144.     synchronized(tm) {
  145.       return tm.remove(x);
  146.     }
  147.   }
  148.  
  149.   /**
  150.    * Restituisce il volo precedentemente selezionato dall'utente.
  151.    */
  152.   private Volo getVolo(Cliente x){
  153.     synchronized(tm){
  154.       return tm.get(x);
  155.     }
  156.   }
  157.  
  158. }
  159.  
  160. /* ************** Classe Volo ***************** */
  161.  
  162. public class Volo {
  163.  
  164.   // Stato dei singoli posti
  165.   private boolean[] posto = new boolean[60];
  166.  
  167.   // Numero di clienti che hanno selezionato il volo
  168.   private int nc;
  169.  
  170.   public synchronized int getNumeroClienti() {
  171.     return nc;
  172.   }
  173.  
  174.   public synchronized void nuovoCliente() {
  175.     nc++;
  176.   }
  177.  
  178.   public synchronized void clienteDeseleziona() {
  179.     nc--;
  180.   }
  181.  
  182.   public synchronized boolean prenota(int row, char seat) {
  183.     if(row<1 || row >10 || seat < 'A' || seat > 'F')
  184.       throw new IllegalArgumentException();
  185.     int index = (row-1)*10 + (seat - 'A');
  186.     if(posto[index])
  187.       return false;
  188.     posto[index] = true;
  189.     return true;
  190.   }
  191. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement