/** * Classe Albergo * @author mariachiarapuviani * * Rappresenta il monitor * */ import monitor.*; //******************************************************************************/ // definizione di una classe che estende Monitor / //******************************************************************************/ public class Albergo extends Monitor { //******************************************************************************/ // dichiarazione delle variabili di stato del Monitor / //******************************************************************************/ int camere; // numero massimo di camere disponibili int N_camere[]; // array che rappresenta il numero di camere disponibili per ogni tipologia // N_camere[0] = camere con 1 letto // N_camere[1] = camere con 2 letti // N_camere[2] = camere con 3 letti // N_camere[3] = camere con 4 letti int divisione; //N di camere per tipologia int gruppi_sospesi; // contatore dei gruppi sospesi int singoli_sospesi; // contatore dei singoli sospesi //******************************************************************************/ // dichiarazione di variabili condition del Monitor / //******************************************************************************/ Cond coda; // variabili condition --> coda dei gruppi sospesi Cond singoli; // variabili condition --> coda su cui si sospendono i singolo //******************************************************************************/ // costruttore del Monitor / //******************************************************************************/ public Albergo(int camere) { gruppi_sospesi = 0; singoli_sospesi= 0; this.camere = camere; this.divisione = this.camere / 4; N_camere = new int[4]; for (int i = 0; i < 4; i++) { N_camere[i] = this.divisione; //inizialmente per ogni tipologia disponibile il max numero di camere } coda = new Cond(this); singoli = new Cond(this); } /** * Funzione di stampa dello stato della risorsa */ private synchronized void stampaStato() { System.out.println(" L1 L2 L3 L4"); for(int i=0; i<4; i++) System.out.print("-----"); System.out.println(); for(int i=0; i<4; i++) System.out.print("| "+N_camere[i]+" "); System.out.print("|\n"); for(int i=0; i<4; i++) System.out.print("-----"); System.out.println(); // questa la prima stampata: // ----------------- // | 0 | 0 | 0 | 0 | // ----------------- // inizialmente al posto dello 0 ci sar il numero di camere disponibili per tipologia } //******************************************************************************/ // dichiarazione e definizione delle procedure di Entry sul Monitor / //******************************************************************************/ public int[] Prenota(int persone, String nome) { // come prima istruzione bisogna invocare entraMonitor entraMonitor(); int[] servono = new int[4]; boolean trovate_stanze = false; int temp = 0; for(int i=0; i<4; i++) { servono[i] = 0; } //Calcolo delle stanze necessarie servono[3] = persone/4; if((persone/4)>0) { temp = persone % 4; } else { temp = persone; } if (temp > 0) servono[temp-1]++; while (!trovate_stanze) { System.out.println(nome+" devo prenotare le stanze."); System.out.println("Ecco la situazione delle stanze nell'albergo:"); stampaStato(); //stampo la situazione delle stanze (prima della prenotazione) System.out.println(nome+" mi servono "+servono[0]+" stanze da 1 posto, "+servono[1]+" stanze da 2 posti, "+servono[2]+" stanze da 3 posti, "+servono[3]+" stanze da 4 posti."); if(N_camere[0] < servono[0] || N_camere[1] 0) singoli.Signal(); else { int s = gruppi_sospesi; for(int i=0; i