— Привет, Амиго!
Сегодня ты начинаешь работу над супер современной и полезной программой! Это – электронное меню. Вот:
— Круто! А для чего это?
— Что-то ты много вопросов задаешь! Вот сделаешь, потом поговорим. Иди к секретному агенту, он даст тебе все необходимые инструкции.
— Товарищ Капитан, я не умею так красиво рисовать!
— Запомни, тебе нужно реализовать необходимую бизнес логику, а картинки будет рисовать дизайнер. Иди к секретному агенту, по ходу дела разберешься.
— Есть разбираться!
16
Задача
Java Multithreading,
9 уровень,
15 лекция
Недоступна
Ресторан(1)
Давай напишем программу для автоматизации работы в ресторане.
Пусть задание сформулировано так - директор ресторана хочет, чтобы:
1) на каждом столике лежал планшет, через который можно было бы сделать заказ;
2) пока заказ готовится, на планшете показывалась реклама;
3) в конце рабочего дня была во
32
Задача
Java Multithreading,
9 уровень,
15 лекция
Недоступна
Ресторан(2)
1. Мы много работаем с консолью. Пора создать единую точку взаимодействия.
Создай класс ConsoleHelper с единственным BufferedReader, через который будем работать с консолью.
Запомни, этот класс не хранит никаких данных и состояний, поэтому все методы будут статическими.
Создай в нем три метода:
32
Задача
Java Multithreading,
9 уровень,
15 лекция
Недоступна
Ресторан(3)
Сейчас мы можем создавать заказы. Давай сделаем так, чтобы они автоматически поступали к повару.
Есть много различных способов реализации данной функциональности.
Почитай про паттерн Observer - http://en.wikipedia.org/wiki/Observer_pattern
Он уже реализован в java, и мы его будем использовать.
16
Задача
Java Multithreading,
9 уровень,
15 лекция
Недоступна
Ресторан(4)
Что мы имеем? Повар приготовил блюда, пора их уносить, а официант не знает об этом.
Нужно уведомить официанта, что пора забирать заказ с кухни.
Ситуация аналогична предыдущему заданию, поэтому снова будем использовать паттерн Observer.
16
Задача
Java Multithreading,
9 уровень,
15 лекция
Недоступна
Ресторан(5)
Сейчас повар готовит блюда моментально. На самом деле приготовление занимает какое-то время.
Нам нужно вычислить время приготовления всего заказа, чтобы потом подбирать рекламные ролики для этого времени.
16
Задача
Java Multithreading,
9 уровень,
15 лекция
Недоступна
Ресторан(6)
Заказ создается, потом готовится поваром, а после этого относится посетителю. К тому же считается время выполнения заказа.
Будем считать, что первая часть задания выполнена.
Перейдем ко второй - пока заказ готовится, на планшете должна показываться реклама.
Определим, что такое реклама.
Реклама - э
16
Задача
Java Multithreading,
9 уровень,
15 лекция
Недоступна
Ресторан(7)
При выборе, с какого класса начать, старайся найти тот, который используют другие, и который сам ничего не использует.
В нашем случае - это хранилище рекламных роликов (AdvertisementStorage).
Мы решили, что оно будет единственным в ресторане и сделали его синглтоном.
Опишем его.
16
Задача
Java Multithreading,
9 уровень,
15 лекция
Недоступна
Ресторан(8)
Пришло время описать функционал класса AdvertisementManager.
Но для начала нам понадобятся некоторые методы в классе Advertisement.
1. В классе Advertisement создай поле long amountPerOneDisplaying.
Оно должно равняться стоимости одного показа рекламного объявления в копейках (initialAmount/hits).
16
Задача
Java Multithreading,
9 уровень,
15 лекция
Недоступна
Ресторан(9)
Нам понадобится исключение, которое поможет обработать ситуацию, если у нас не будет получаться подобрать рекламные ролики.
1. Создадим unchecked исключение NoVideoAvailableException в пакете ad.
2. Разберем подробно метод void processVideos() в AdvertisementManager.
32
Задача
Java Multithreading,
9 уровень,
15 лекция
Недоступна
Ресторан(10)
Рекурсию используют тогда, когда алгоритм решения задачи совпадает с алгоритмом решения подзадачи (части).
У нас как раз такой случай. Нам нужно сделать полный перебор всех вариантов и выбрать из них лучший.
Напомню, рекурсия пишется по следующему принципу:
а) условие выхода/окончания рекурсии
б) у
16
Задача
Java Multithreading,
9 уровень,
15 лекция
Недоступна
Ресторан(11)
Мы реализовали первые две фичи из трех. Напомню, первой была автоматизация приготовления заказа,
второй - подбор рекламных роликов, а третья - статистика для директора. Собственно, к ней мы и добрались.
Нам нужно будет реализовать следующую функциональность:
1) подсчет статистики
2) отображение ста
9
Задача
Java Multithreading,
9 уровень,
15 лекция
Недоступна
Ресторан(12)
У нас выделяются несколько событий:
*повар приготовил заказ
*выбрали набор видео-роликов для заказа
*нет ни одного видео-ролика, который можно показать во время приготовления заказа
Это постоянные данные, поэтому для их хранения подходит энам.
16
Задача
Java Multithreading,
9 уровень,
15 лекция
Недоступна
Ресторан(13)
Вернемся к методу register в классе StatisticManager. Он должен регистрировать события в хранилище.
Создадим хранилище : )
Хранилище связано 1 к 1 с менеджером, т.е. один менеджер и одно хранилище на приложение.
К хранилищу может доступиться только StatisticManager. Поэтому...
Из вышеперечисленного
32
Задача
Java Multithreading,
9 уровень,
15 лекция
Недоступна
Ресторан(14)
1. Внутри StatisticStorage создай метод void put(EventDataRow data).
2. Чтобы методом put(EventDataRow data) добавить объект data в данные карты, нужен тип события - EventType.
Будет правильно, если событие будет хранить в себе свой тип. Поэтому:
2.1. В интерфейс EventDataRow добавь метод EventType
32
Задача
Java Multithreading,
9 уровень,
15 лекция
Недоступна
Ресторан(15)
Давай подумаем что нужно сделать, чтобы директор мог посмотреть:
1) какую сумму заработали на рекламе, сгруппировать по дням;
2) загрузка (рабочее время) повара, сгруппировать по дням;
3) список активных роликов и оставшееся количество показов по каждому;
4) список неактивных роликов (с оставшемся к
32
Задача
Java Multithreading,
9 уровень,
15 лекция
Недоступна
Ресторан(16)
Реализуем первый пункт статистики - какую сумму заработали на рекламе, сгруппировать по дням.
1. В классе VideoSelectedEventDataRow создай геттер для поля amount.
В классе CookedOrderEventDataRow создай геттер для поля cookName.
2. В StatisticManager создай метод (придумать самостоятельно), которы
32
Задача
Java Multithreading,
9 уровень,
15 лекция
Недоступна
Ресторан(17)
Реализуем третий и четвертый пункт статистики - список активных и неактивных роликов.
Для этого проще использовать доступ к хранилищу рекламных роликов - класс AdvertisementStorage.
1. В пакете ad создай StatisticAdvertisementManager, который будет предоставлять информацию из AdvertisementStorage в н
32
Задача
Java Multithreading,
9 уровень,
15 лекция
Недоступна
Ресторан(18)
Сейчас у нас один планшет и 1 повар.
Давай создадим несколько планшетов, которые будут рандомно генерировать заказы, и сделаем два повара.
1. В классе Restaurant создай ПРИВАТНУЮ статическую константу int ORDER_CREATING_INTERVAL = 100.
2. В отдельном классе создай таск(Runnable) RandomOrderGenerat
32
Задача
Java Multithreading,
9 уровень,
15 лекция
Недоступна
Ресторан(19)
Нам осталось доделать метод main.
Сперва давай сравним параметры конструктора RandomOrderGeneratorTask.
Пожалуйста, сделай сигнатуру такой же, как у меня:
public RandomOrderGeneratorTask(List<Tablet> tablets, int interval)
В методе main:
1. Удали создание хардкоженного планшета и вызова его метода
16
Задача
Java Multithreading,
9 уровень,
15 лекция
Недоступна
Ресторан(20)
Фикс бага - планшет направляет свой заказ всем известным ему поварам.
Ожидаемое поведение: планшет направляет свой заказ в очередь, свободный повар берет заказы из очереди.
Есть два варианта реализации такого функционала:
1) Каждый планшет хранит ссылку на очередь и толкает в нее новый свой заказ.
32
Задача
Java Multithreading,
9 уровень,
15 лекция
Недоступна
Ресторан(21)
Продолжаем фиксить баг.
Сейчас все заказы поступают в очередь, но не доходят до поваров.
Сделаем так, чтобы OrderManager находил любого свободного повара и отдавал ему заказ. Для реализации данной логики
нам понадобится демон-трэд. Он будет проверять наличие заказа в очереди, брать свободного повар
32
Задача
Java Multithreading,
9 уровень,
15 лекция
Недоступна
Ресторан(22)
К сожалению, заказы все еще не готовятся параллельно. Вот как работает наш трэд из предыдущего задания.
Он находит повара, потом находит заказ, отдает заказ повару методом startCookingOrder, потом ждет окончания приготовления,
и только после этого переходит к следующему заказу. Так происходит потому
9
Задача
Java Multithreading,
9 уровень,
15 лекция
Недоступна
Ресторан(23)
Это всё! Красоту можешь наводить самостоятельно.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ