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