//yes, making it my aim to preach the Good News, not where Christ was already named, that I might not build on another's foundation. (Romans 15:20) --------------------------------------------Restaurant.java--------------------------------------------------------------------- package com.javarush.task.task17.task1712; import java.util.ArrayList; import java.util.List; /* Ресторан */ public class Restaurant { public static List 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; } } -------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------Cook.java--------------------------------------------------------------------------- package com.javarush.task.task17.task1712; 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); } } -------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------Dishes.java------------------------------------------------------------------------ package com.javarush.task.task17.task1712; public class Dishes { private byte tableNumber; public Dishes(byte tableNumber) { this.tableNumber = tableNumber; } public byte getTableNumber() { return tableNumber; } } -------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------Manager.java----------------------------------------------------------------------- package com.javarush.task.task17.task1712; 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 restaurantTables = new ArrayList
(10); private int currentIndex = 0; private final Queue orderQueue = new ConcurrentLinkedQueue(); // очередь с заказами private final Queue dishesQueue = new ConcurrentLinkedQueue(); // очередь с готовыми блюдами 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 getOrderQueue() { return orderQueue; } public Queue getDishesQueue() { return dishesQueue; } } -------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------Order.java------------------------------------------------------------------------ package com.javarush.task.task17.task1712; 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; } } -------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------Table.java----------------------------------------------------------------------- package com.javarush.task.task17.task1712; public class Table { private static byte tableNumber; private byte number = ++tableNumber; public Order getOrder () { return new Order(number); } } -------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------Waiter.java---------------------------------------------------------------------- package com.javarush.task.task17.task1712; 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) { } } } } -------------------------------------------------------------------------------------------------------------------------------- /* Ресторан 1.Разберись, что делает программа. Официант почему-то не относит приготовленные блюда назад к столам :( 2.Исправь ошибку. Подсказка: это одна строчка Требования: 1. Класс Restaurant должен содержать список поваров и официантов (public static поле threads типа List). 2. Класс Manager должен содержать очередь с заказами (private final поле orderQueue типа Queue). 3. Класс Manager должен содержать очередь с готовыми блюдами (private final поле dishesQueue типа Queue). 4. Класс Manager должен реализовывать паттерн Singleton. 5. Класс Waiter должен реализовывать интерфейс Runnable. 6. Класс Cook должен реализовывать интерфейс Runnable. 7. Если нет готовых блюд в очереди, нить класса Waiter должна получать заказ от столика и добавлять его в очередь заказов. 8. Если есть готовые блюда в очереди, нить класса Waiter должна брать блюдо из очереди и относить заказ для столика. 9. Если нет заказов в очереди с заказами, нить класса Cook должна отдыхать (повар отдыхает). 10. Если есть заказы в очереди с заказами, нить класса Cook должна готовить блюдо и добавлять его в очередь с готовыми блюдами. --------------------------------------------Restaurant.java--------------------------------------------------------------------- package com.javarush.task.task17.task1712; import java.util.ArrayList; import java.util.List; /* Ресторан */ public class Restaurant { public static List 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; } } -------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------Cook.java--------------------------------------------------------------------------- package com.javarush.task.task17.task1712; 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())); } } -------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------Dishes.java------------------------------------------------------------------------ package com.javarush.task.task17.task1712; public class Dishes { private byte tableNumber; public Dishes(byte tableNumber) { this.tableNumber = tableNumber; } public byte getTableNumber() { return tableNumber; } } -------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------Manager.java----------------------------------------------------------------------- package com.javarush.task.task17.task1712; 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
restaurantTables = new ArrayList
(10); private int currentIndex = 0; private final Queue orderQueue = new ConcurrentLinkedQueue(); // очередь с заказами private final Queue dishesQueue = new ConcurrentLinkedQueue(); // очередь с готовыми блюдами 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 getOrderQueue() { return orderQueue; } public Queue getDishesQueue() { return dishesQueue; } } -------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------Order.java------------------------------------------------------------------------ package com.javarush.task.task17.task1712; 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; } } -------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------Table.java----------------------------------------------------------------------- package com.javarush.task.task17.task1712; public class Table { private static byte tableNumber; private byte number = ++tableNumber; public Order getOrder () { return new Order(number); } } -------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------Waiter.java---------------------------------------------------------------------- package com.javarush.task.task17.task1712; 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) { } } } } -------------------------------------------------------------------------------------------------------------------------------- */