Advertisement
Jerkiller

ese2

Apr 2nd, 2015
243
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.73 KB | None | 0 0
  1. /*
  2.    Officina Ferrari. Corso di SO 2014/15 Ca' Foscari.
  3.  
  4.    Ci sono nGomme gommisti che montano gomme sulle auto. I gommisti devono attendere
  5.    l'arrivo delle gomme su 2 nastri. Ogni gommista ha un id. Se l'id è pari attende
  6.    le gomme dal nastro 0 (destro) se l'id è dispari dal nastro sinistro (1).
  7.    i gommisti non si scontrano tra loro (questa sincronizzazione è già realizzata)
  8.  
  9.    Si devono realizzare le seguenti sincronizzazioni
  10.    - i gommisti attendono la gomma sul nastro (attendiGomma)
  11.    - i gommisti notificano l'avvenuto prelievo della gomma (prelevataGomma)
  12.    - i nastri si fermano finché uno dei gommisti non preleva la gomma (gommaFineNastro)
  13.    - i gommisti attendono le auto (attendiAuto)
  14.    - i gommisti notificano l'avvenuto montaggio (gommaMontata)
  15.    - le auto attendono il montaggio di tutte le gomme (attendiMontaggioGomme)
  16.  
  17.  
  18.    le auto si comportano come segue
  19.    while(true) {
  20.          // Porta le macchine senza gomme
  21.      
  22.          // Attende il montaggio delle gomme
  23.          officina.attendiMontaggioGomme();
  24.      
  25.          // Porta via le macchine con le gomme
  26.     }
  27.  
  28.    i gommisti si comportano come segue:
  29.     while(true) {
  30.         // il gommista si sposta fino al nastro delle gomme
  31.  
  32.         // il gommista attende la gomma
  33.         officina.attendiGomma(id);
  34.  
  35.         // il gommista rimuove la gomma dal nastro
  36.  
  37.         // il gommista notifica che ha prelevato la gomma
  38.         officina.prelevataGomma(id);
  39.  
  40.         // il gommista si sposta fino all'auto per montare la gomma
  41.  
  42.         // il gommmista attende l'auto
  43.         officina.attendiAuto(id);
  44.  
  45.         // il gommista notifica il montaggio della gomma
  46.         officina.gommaMontata(id);
  47.     }  
  48.    
  49.     i nastri delle gomme si comportano come segue:
  50.     while(true) {
  51.  
  52.         // si muove
  53.  
  54.         // se è in fondo attende che la gomma sia prelevata
  55.             officina.gommaFineNastro(n);
  56.     }
  57.  
  58.  
  59.    
  60.  */
  61.  
  62. public class Officina {
  63.     int nGomme; // numero gomme da montare
  64.     boolean nastro[];
  65.     boolean autopronta;
  66.     boolean gommamontata[];
  67.  
  68.     Officina(int nGomme) {
  69.         this.nGomme = nGomme;
  70.         inizializza();
  71.     }
  72.  
  73.     void inizializza() {
  74.         /*
  75.         Inizializzo un array che rappresenta lo stato dei due nastri,
  76.         nastro[0] simboleggia il nastro destro e nastro[1] il nastro sinistro.
  77.         inizialmente i due nastri sono sgombri, per cui li inizializzo a false.
  78.         */
  79.         nastro=new boolean[2];
  80.         nastro[0]=false;
  81.         nastro[1]=false;
  82.  
  83.        
  84.  
  85.         /*
  86.         mi salvo la presenza di un auto in posizione di montaggio (true)
  87.         o l'eventuale assenza (false).
  88.         */
  89.         autopronta=true;
  90.  
  91.         /*
  92.         mi salvo in un array di booleani se una gomma è stata montata (true)
  93.         oppure non ancora (false).
  94.         */
  95.         gommamontata=new boolean[nGomme];
  96.         for(int o=0;o<nGomme;o++)gommamontata[o]=false;
  97.  
  98.     }
  99.  
  100.     // il gommista id attende l'arrivo della gomma. I gommisti con id pari attendono dal
  101.     // nastro di destra, quelli con id dispari dal nastro di sinistra
  102.     public synchronized void attendiGomma(int id) throws InterruptedException {
  103.         /*
  104.         Finché il nastro del lato del gommista è vuoto,
  105.         il gommista attende l'arrivo di una gomma.
  106.         Per gestire il lato del gommista utilizzo il modulo...
  107.         */
  108.         while(!nastro[id%2])wait();
  109.        
  110.     }
  111.  
  112.     // il gommista id notifica che ha prelevato una gomma dal proprio nastro
  113.     public synchronized void prelevataGomma(int id) {
  114.         /*
  115.         Il gommista svuota il nastro prelevando la gomma, per cui pone il nastro
  116.         sinistro a false se il gommista è a sinistra, o viceversa.
  117.         */
  118.         nastro[id%2]=false;
  119.        
  120.  
  121.         /*
  122.         Notifico a tutti che come gommista ho prelevato una gomma, in questo modo,
  123.         anche i nastri verranno notificati e ricominceranno a scorrere
  124.         se erano stati precedentemente bloccati.
  125.         */
  126.         notifyAll();
  127.     }
  128.  
  129.     // la gomma è arrivata a fine nastro n e attende di essere prelevata da un gommista
  130.     // n vale 0 per il nastro di destra e 1 per il nastro di sinistra
  131.     public synchronized void gommaFineNastro(int n) throws InterruptedException {
  132.         /*
  133.         setto il nastro n (0 dx e 1 sx) a true per indicare che la gomma è arrivata.
  134.         */
  135.         nastro[n]=true;
  136.  
  137.  
  138.         notifyAll();
  139.         while(nastro[n])wait();
  140.        
  141.  
  142.        
  143.         /*
  144.         Se per caso uno o più gommisti dal lato della gomma sono in coda sulla wait
  145.         li notifico in modo da sbloccarli e far sì che prelevino la gomma.
  146.         */
  147.         notifyAll();
  148.  
  149.     }
  150.  
  151.     // il gommista id attende che l'auto arrivi
  152.     public synchronized void attendiAuto(int id) throws InterruptedException {
  153.         /*
  154.         attendo che ci sia un auto
  155.         */
  156.         while(!autopronta)wait();
  157.     }
  158.  
  159.     // il gommista id ha montato la sua gomma
  160.     public synchronized void gommaMontata(int id) throws InterruptedException{
  161.         /*
  162.         Se la gomma id è già stata montata, allora aspetto.
  163.         Se la gomma id non è stata montata, allora la monto (settandola a true)
  164.         */
  165.         while(gommamontata[id])wait();
  166.         gommamontata[id]=true;
  167.         /* Notifico che ho montato la gomma */
  168.         notifyAll();
  169.     }
  170.  
  171.     // le auto sono in posizione e attendono il montaggio delle gomme
  172.     public synchronized void attendiMontaggioGomme() throws InterruptedException {
  173.        
  174.         /*
  175.         attendo che le nuove auto siano arrivate..
  176.         */
  177.  
  178.  
  179.         /*
  180.         Notifico a tutti che l'auto sia pronta e sia uscita dalla coda di montaggio.
  181.         */
  182.         autopronta=true;
  183.         /*
  184.         reimposta tutte le gomme a false per dire che non sono ancora state montate
  185.         sulla prossima auto.
  186.         */
  187.         for(int o=0;o<nGomme;o++)gommamontata[o]=false;
  188.        
  189.  
  190.         notifyAll();
  191.  
  192.         /*
  193.         attendo che l'auto pronta sia montata, ovvero quando le 4 gomme saranno montate
  194.         */
  195.         while(!tuttemontate())wait();
  196.         autopronta=false;
  197.        
  198.     }
  199.  
  200.     /*Restituisce true se tutte le gomme sono state montate*/
  201.     private boolean tuttemontate(){
  202.         /*faccio l'and logico con ogni gomma montata...
  203.         in questo modo ritorno
  204.        
  205.         */
  206.         boolean temp=true;
  207.         for(int i=0;i<nGomme;i++)
  208.             temp=temp&&gommamontata[i];
  209.         return temp;
  210.     }
  211.  
  212.  
  213.  
  214. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement