public class Floor { enum State { NO_ONE_WAITING, PASSENGERS_WAITING, LOADING } private int passengersWaiting = 0; private State state = State.NO_ONE_WAITING; synchronized public void waitForElevator(String msg) { if (state == State.LOADING) { try { wait(); } catch (InterruptedException ex) { } } passengersWaiting++; System.out.println(msg); if (state == State.NO_ONE_WAITING) { this.state = State.PASSENGERS_WAITING; notifyAll(); } } synchronized public void getOnOffElevator(String msg) { if (state != State.LOADING) { try { wait(); } catch (InterruptedException ex) { } } passengersWaiting--; System.out.println(msg); if (passengersWaiting == 0) { this.state = State.NO_ONE_WAITING; notifyAll(); } } synchronized public void elevatorArrives(String msg) { if (state == State.LOADING) { try { wait(); } catch (InterruptedException ex) { } } System.out.println(msg); if (state == State.PASSENGERS_WAITING) { this.state = State.LOADING; } else { this.state = State.NO_ONE_WAITING; } notifyAll(); } synchronized public void elevatorLeaves(String msg) { if (state != State.NO_ONE_WAITING) { try { wait(); } catch (InterruptedException ex) { } } System.out.println(msg); } }