package com.javarush.test.level17.lesson10.bonus03; /* Ресторан 1.Разберись, что делает программа. Официант почему-то не относит приготовленные блюда назад к столам 🙁 2.Исправь ошибку. Подсказка: это одна строчка */ import java.util.ArrayList; import java.util.List; public class Restaurant { public static List<Thread> threads = new ArrayList<>(); public static void main(String[] args) throws Exception { Waiter waiterTarget = new Waiter(); Thread waiter = new Thread(waiterTarget); threads.add(waiter); Cook cookTarget = new Cook(); Thread cook = new Thread(cookTarget); threads.add(cook); waiter.start(); cook.start(); Thread.sleep(2000); cookTarget.continueWorking = false; Thread.sleep(500); waiterTarget.continueWorking = false; } }
package com.javarush.test.level17.lesson10.bonus03; public class Dishes { private byte tableNumber; public Dishes(byte tableNumber) { this.tableNumber = tableNumber; } public byte getTableNumber() { return tableNumber; } }
package com.javarush.test.level17.lesson10.bonus03; public class Order { private long time; private byte tableNumber; public Order(byte tableNumber) { time = (long) (Math.random() * 200); this.tableNumber = tableNumber; } public long getTime() { return time; } public byte getTableNumber() { return tableNumber; } }
package com.javarush.test.level17.lesson10.bonus03; public class Waiter implements Runnable { public boolean continueWorking = true; @Override public void run() { Manager manager = Manager.getInstance(); while (continueWorking || !manager.getDishesQueue().isEmpty()) { if (!manager.getDishesQueue().isEmpty()) { //относим готовый заказ Dishes dishes = manager.getDishesQueue().poll(); System.out.println("Официант отнес заказ для стола №" + dishes.getTableNumber()); } else { //берем новый заказ Table table = manager.getNextTable(); Order order = table.getOrder(); System.out.println("Получен заказ от стола №" + order.getTableNumber()); manager.getOrderQueue().add(order); } try { Thread.sleep(100); //walking to the next table } catch (InterruptedException e) { } } } }
package com.javarush.test.level17.lesson10.bonus03; import java.util.ArrayList; import java.util.List; import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; public class Manager { //singleton private static Manager ourInstance = new Manager(); private final List<Table> restaurantTables = new ArrayList<Table>(10); private int currentIndex = 0; private final Queue<Order> orderQueue = new ConcurrentLinkedQueue<Order>(); // очередь с заказами private final Queue<Dishes> dishesQueue = new ConcurrentLinkedQueue<Dishes>(); // очередь с готовыми блюдами public synchronized static Manager getInstance() { return ourInstance; } private Manager() { // создаем 10 столов for (int i = 0; i < 10; i++) { restaurantTables.add(new Table()); } } public synchronized Table getNextTable() { // официант ходит по кругу от 1 стола к 10 Table table = restaurantTables.get(currentIndex); currentIndex = (currentIndex + 1) % 10; return table; } public Queue<Order> getOrderQueue() { return orderQueue; } public Queue<Dishes> getDishesQueue() { return dishesQueue; } }
package com.javarush.test.level17.lesson10.bonus03; public class Table { private static byte tableNumber; private byte number = ++tableNumber; public Order getOrder () { return new Order(number); } }
package com.javarush.test.level17.lesson10.bonus03; public class Cook implements Runnable { public boolean continueWorking = true; @Override public void run() { boolean needToWait; while (continueWorking || needToCookOrders()) { try { synchronized (this) { needToWait = !needToCookOrders(); if (!needToWait) { cooking(); } } if (continueWorking && needToWait) { System.out.println("Повар отдыхает"); Thread.sleep(100); } } catch (InterruptedException e) { } } } private boolean needToCookOrders() { return !Manager.getInstance().getOrderQueue().isEmpty(); } private void cooking() throws InterruptedException { Manager manager = Manager.getInstance(); Order order = manager.getOrderQueue().poll(); // повар берет заказ из очереди System.out.println(String.format("Заказ будет готовиться %d мс для стола №%d", order.getTime(), order.getTableNumber())); Thread.sleep(order.getTime()); // готовим блюдо Dishes dishes = new Dishes(order.getTableNumber()); // это готовое блюдо System.out.println(String.format("Заказ для стола №%d готов", dishes.getTableNumber())); manager.getDishesQueue().add(dishes); //та самая строка } }
Leave A Comment