Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Officina Ferrari. Corso di SO 2014/15 Ca' Foscari.
- Ci sono nGomme gommisti che montano gomme sulle auto. I gommisti devono attendere
- l'arrivo delle gomme su 2 nastri. Ogni gommista ha un id. Se l'id è pari attende
- le gomme dal nastro 0 (destro) se l'id è dispari dal nastro sinistro (1).
- i gommisti non si scontrano tra loro (questa sincronizzazione è già realizzata)
- Si devono realizzare le seguenti sincronizzazioni
- - i gommisti attendono la gomma sul nastro (attendiGomma)
- - i gommisti notificano l'avvenuto prelievo della gomma (prelevataGomma)
- - i nastri si fermano finché uno dei gommisti non preleva la gomma (gommaFineNastro)
- - i gommisti attendono le auto (attendiAuto)
- - i gommisti notificano l'avvenuto montaggio (gommaMontata)
- - le auto attendono il montaggio di tutte le gomme (attendiMontaggioGomme)
- le auto si comportano come segue
- while(true) {
- // Porta le macchine senza gomme
- // Attende il montaggio delle gomme
- officina.attendiMontaggioGomme();
- // Porta via le macchine con le gomme
- }
- i gommisti si comportano come segue:
- while(true) {
- // il gommista si sposta fino al nastro delle gomme
- // il gommista attende la gomma
- officina.attendiGomma(id);
- // il gommista rimuove la gomma dal nastro
- // il gommista notifica che ha prelevato la gomma
- officina.prelevataGomma(id);
- // il gommista si sposta fino all'auto per montare la gomma
- // il gommmista attende l'auto
- officina.attendiAuto(id);
- // il gommista notifica il montaggio della gomma
- officina.gommaMontata(id);
- }
- i nastri delle gomme si comportano come segue:
- while(true) {
- // si muove
- // se è in fondo attende che la gomma sia prelevata
- officina.gommaFineNastro(n);
- }
- */
- public class Officina {
- int nGomme; // numero gomme da montare
- boolean nastro[];
- boolean autopronta;
- boolean gommamontata[];
- Officina(int nGomme) {
- this.nGomme = nGomme;
- inizializza();
- }
- void inizializza() {
- /*
- Inizializzo un array che rappresenta lo stato dei due nastri,
- nastro[0] simboleggia il nastro destro e nastro[1] il nastro sinistro.
- inizialmente i due nastri sono sgombri, per cui li inizializzo a false.
- */
- nastro=new boolean[2];
- nastro[0]=false;
- nastro[1]=false;
- /*
- mi salvo la presenza di un auto in posizione di montaggio (true)
- o l'eventuale assenza (false).
- */
- autopronta=true;
- /*
- mi salvo in un array di booleani se una gomma è stata montata (true)
- oppure non ancora (false).
- */
- gommamontata=new boolean[nGomme];
- for(int o=0;o<nGomme;o++)gommamontata[o]=false;
- }
- // il gommista id attende l'arrivo della gomma. I gommisti con id pari attendono dal
- // nastro di destra, quelli con id dispari dal nastro di sinistra
- public synchronized void attendiGomma(int id) throws InterruptedException {
- /*
- Finché il nastro del lato del gommista è vuoto,
- il gommista attende l'arrivo di una gomma.
- Per gestire il lato del gommista utilizzo il modulo...
- */
- while(!nastro[id%2])wait();
- }
- // il gommista id notifica che ha prelevato una gomma dal proprio nastro
- public synchronized void prelevataGomma(int id) {
- /*
- Il gommista svuota il nastro prelevando la gomma, per cui pone il nastro
- sinistro a false se il gommista è a sinistra, o viceversa.
- */
- nastro[id%2]=false;
- /*
- Notifico a tutti che come gommista ho prelevato una gomma, in questo modo,
- anche i nastri verranno notificati e ricominceranno a scorrere
- se erano stati precedentemente bloccati.
- */
- notifyAll();
- }
- // la gomma è arrivata a fine nastro n e attende di essere prelevata da un gommista
- // n vale 0 per il nastro di destra e 1 per il nastro di sinistra
- public synchronized void gommaFineNastro(int n) throws InterruptedException {
- /*
- setto il nastro n (0 dx e 1 sx) a true per indicare che la gomma è arrivata.
- */
- nastro[n]=true;
- notifyAll();
- while(nastro[n])wait();
- /*
- Se per caso uno o più gommisti dal lato della gomma sono in coda sulla wait
- li notifico in modo da sbloccarli e far sì che prelevino la gomma.
- */
- notifyAll();
- }
- // il gommista id attende che l'auto arrivi
- public synchronized void attendiAuto(int id) throws InterruptedException {
- /*
- attendo che ci sia un auto
- */
- while(!autopronta)wait();
- }
- // il gommista id ha montato la sua gomma
- public synchronized void gommaMontata(int id) throws InterruptedException{
- /*
- Se la gomma id è già stata montata, allora aspetto.
- Se la gomma id non è stata montata, allora la monto (settandola a true)
- */
- while(gommamontata[id])wait();
- gommamontata[id]=true;
- /* Notifico che ho montato la gomma */
- notifyAll();
- }
- // le auto sono in posizione e attendono il montaggio delle gomme
- public synchronized void attendiMontaggioGomme() throws InterruptedException {
- /*
- attendo che l'auto pronta sia montata, ovvero quando le 4 gomme saranno montate
- */
- while(!tuttemontate())wait();
- /*
- attendo che le nuove auto siano arrivate..
- */
- /*
- Notifico a tutti che l'auto sia pronta e sia uscita dalla coda di montaggio.
- */
- autopronta=true;
- /*
- reimposta tutte le gomme a false per dire che non sono ancora state montate
- sulla prossima auto.
- */
- for(int o=0;o<nGomme;o++)gommamontata[o]=false;
- notifyAll();
- }
- /*Restituisce true se tutte le gomme sono state montate*/
- private boolean tuttemontate(){
- /*faccio l'and logico con ogni gomma montata...
- in questo modo ritorno
- */
- boolean temp=true;
- for(int i=0;i<nGomme;i++)
- temp=temp&&gommamontata[i];
- return temp;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement