Question
Description: A modified Sleeping Barber Problem
You must provide a methodology, design specification, Java Implementation
and results (do not include packages or jar files in your final submission) for
this assignment (see Problem below). Submit your assignment in a ZIP file
to BlackBoard, with clearly defined parts.
For you design specification you may want to include the following
diagrams and descriptions:
1) Sequence Diagram
2) Class Diagram
3) State Diagram
4) Data Flow Diagram
5) Collaborations and class responsibilities
The submission will include Word or Text files and the java source and class
files. Each deliverable must be clearly labeled, including your name and
course title.
See the Deliverables section for details.
Problem Description:
A barbershop has a cutting room with one chair and a waiting room with
five chairs. A limitless number of customers enter the waiting room one at a
time if space is available; otherwise they go to another shop. Each time the barber finishes a haircut, the customer must pay at the cash
register; only one customer may pay at a time, addition customers waiting to
pay must wait, if the cashier is asleep, the paying customer must wake the
cashier up, after paying the customer leaves to go to another store, if the
cashier has no waiting customers, the cashier falls asleep. A waiting
customer, if there is one, enters the cutting room and has a haircut.
Customers may enter the waiting room one at a time, or waiting customer
may enter the (empty) cutting room one at a time, but these events are
mutually exclusive. If the barber discovers that the waiting room is empty,
the barber falls asleep in the waiting room. An arriving customer, finding the
barber asleep, wakes the barber and has a haircut; otherwise the arriving
customer waits. Use must use java semaphores/monitors to coordinate the
operation of the barber, clients and the cash register.
Customers are processed in the order that they are seated (FIFO), earliest
has highest priority, except for one condition below
A priority customer that has made an appointment, when this customer
enters, he/she is now the next customer to get a hair cut, all other
customers are moved back one, if more than one priority customer enters
the shop, he/she is placed behind then last priority customer,(FIFO),
For example assume two priority customers have entered the shop plus 3
regular customers and the left side is next available of the queue. (FIFO)
Entry Times are
Priority customer 1 entered store at 10:01:00
Priority customer 2 entered the store at 10:01:08
Customer 3 entered before customer 4
Customer 4 entered before customer 5
Priority customer 1, priority customer 2, customer 3, customer 4, customer 5
(left side of FIFO)
Note: in the case of priority customers, you really can
Explanation / Answer
import java.util.concurrent.*; public class SleepingBarber extends Thread { /* PREREQUISITES */ /* we create the semaphores. First there are no customers and the barber is asleep so we call the constructor with parameter 0 thus creating semaphores with zero initial permits. Semaphore(1) constructs a binary semaphore, as desired. */ public static Semaphore customers = new Semaphore(0); public static Semaphore barber = new Semaphore(0); public static Semaphore accessSeats = new Semaphore(1); /* we denote that the number of chairs in this barbershop is 5. */ public static final int CHAIRS = 5; /* we create the integer numberOfFreeSeats so that the customers can either sit on a free seat or leave the barbershop if there are no seats available */ public static int numberOfFreeSeats = CHAIRS; /* THE CUSTOMER THREAD */ class Customer extends Thread { /* we create the integer iD which is a unique ID number for every customer and a boolean notCut which is used in the Customer waiting loop */ int iD; boolean notCut=true; /* Constructor for the Customer */ public Customer(int i) { iD = i; } public void run() { while (notCut) { // as long as the customer is not cut try { accessSeats.acquire(); //tries to get access to the chairs if (numberOfFreeSeats > 0) { //if there are any free seats System.out.println("Customer " + this.iD + " just sat down."); numberOfFreeSeats--; //sitting down on a chair customers.release(); //notify the barber that there is a customer accessSeats.release(); // don't need to lock the chairs anymore try { barber.acquire(); // now it's this customers turn but we have to wait if the barber is busy notCut = false; // this customer will now leave after the procedure this.get_haircut(); //cutting... } catch (InterruptedException ex) {} } else { // there are no free seats System.out.println("There are no free seats. Customer " + this.iD + " has left the barbershop."); accessSeats.release(); //release the lock on the seats notCut=false; // the customer will leave since there are no spots in the queue left. } } catch (InterruptedException ex) {} } } /* this method will simulate getting a hair-cut */ public void get_haircut(){ System.out.println("Customer " + this.iD + " is getting his hair cut"); try { sleep(5050); } catch (InterruptedException ex) {} } } /* THE BARBER THREAD */ class Barber extends Thread { public Barber() {} public void run() { while(true) { // runs in an infinite loop try { customers.acquire(); // tries to acquire a customer - if none is available he goes to sleep accessSeats.release(); // at this time he has been awaken -> want to modify the number of available seats numberOfFreeSeats++; // one chair gets free barber.release(); // the barber is ready to cut accessSeats.release(); // we don't need the lock on the chairs anymore this.cutHair(); //cutting... } catch (InterruptedException ex) {} } } /* this method will simulate cutting hair */ public void cutHair(){ System.out.println("The barber is cutting hair"); try { sleep(5000); } catch (InterruptedException ex){ } } } /* main method */ public static void main(String args[]) { SleepingBarber barberShop = new SleepingBarber(); //Creates a new barbershop barberShop.start(); // Let the simulation begin } public void run(){ Barber giovanni = new Barber(); //Giovanni is the best barber ever giovanni.start(); //Ready for another day of work /* This method will create new customers for a while */ for (int i=1; i