import java.awt.*; import java.applet.Applet; import java.awt.event.*; public class Cafe extends Applet implements ActionListener { private Button burger, fries, cola, cooked; private TextField newOrder = new TextField("awaiting order", 20); private TextArea queueDisplay = new TextArea("QUEUE\n", 5, 10, TextArea.SCROLLBARS_VERTICAL_ONLY); private TextField cooking = new TextField("nothing is cooking", 20); private Order order, complete; public void init() { burger = new Button("Burger"); add (burger); burger.addActionListener(this); fries = new Button("Fries"); add (fries); fries.addActionListener(this); cola = new Button("Cola"); add (cola); cola.addActionListener(this); add(newOrder); add(queueDisplay); add(cooking); cooked = new Button("Cooked"); add (cooked); cooked.addActionListener(this); order = new Order(); Queue queue = new Queue(queueDisplay); complete = new Order(); Waiter waiter = new Waiter(newOrder, order, queue); waiter.start(); Chef chef = new Chef(cooking, complete, queue); chef.start(); } public void actionPerformed (ActionEvent event) { if (event.getSource() == burger) order.notifyEvent("burger"); if (event.getSource() == fries) order.notifyEvent("fries"); if (event.getSource() == cola) order.notifyEvent("cola"); if (event.getSource() == cooked) complete.notifyEvent("cooked"); } } class Waiter extends Thread { private Order order; private TextField display; private Queue queue; public Waiter(TextField display, Order order, Queue queue) { this.order = order; this.display = display; this.queue = queue; } public void run() { while (true) { String newOrder = order.waitForEvent(); display.setText("new order: " + newOrder); try { Thread.sleep(5000); } catch (InterruptedException e) { System.err.println("Exception"); } display.setText("awaiting order"); queue.enter(newOrder); } } } class Order { private String order = ""; public synchronized void notifyEvent(String newOrder) { order = newOrder; notify(); } public synchronized String waitForEvent() { while (order.equals("")) try { wait(); } catch (InterruptedException e) { System.err.println("Exception"); } String newOrder = order; order = ""; return newOrder; } } class Queue { private TextArea display; private String[] queue = new String[5]; private int count = 0; public Queue(TextArea display) { this.display = display; } public synchronized void enter(String item) { queue[count] = item; count++; display(); notify(); } public synchronized String remove() { while (count == 0) try { wait(); } catch (InterruptedException e) { System.err.println("Exception"); } String item = queue[0]; count--; for (int c = 0; c < count; c++) queue[c] = queue[c+1]; display(); return item; } private void display() { display.setText("QUEUE\n"); for (int c = 0; c < count; c++) display.append(queue[c] + "\n"); } } class Chef extends Thread{ private TextField display; private Order complete; private Queue queue; public Chef(TextField display, Order complete, Queue queue) { this.display = display; this.complete = complete; this.queue = queue; } public void run() { display.setText("nothing is cooking"); while (true) { String order = queue.remove(); display.setText(order + " is cooking"); String cookedInfo = complete.waitForEvent(); display.setText("nothing is cooking"); } } }