Проверяла программу, случайно нажала проверку и приняло задачу :) Но по сути не работает функция directorTablet.printCookWorkloading(). Раньше все работало. Подскажите, где искать ошибку.
Restaurant
public class Restaurant {
private static final int ORDER_CREATING_INTERVAL = 100;
private final static LinkedBlockingQueue<Order> orderQueue = new LinkedBlockingQueue<>( );
public static void main(String[] args) {
//официант у нас один
Waiter waitor = new Waiter();
//2 повара привязываем к официанту и регистрируем в хралище статистики
List<Cook> cookLists = new ArrayList<>( );
for (int i = 0; i < 2; i++) {
Cook cook = new Cook( "Amigo" + i );
cook.setQueue( orderQueue );
cook.addObserver( waitor );
cookLists.add( cook );
}
//у нас 5 платшетов, привязываем к очереди
List<Tablet> tabletList = new ArrayList<>( );
for (int i = 0; i < 5; i++ ) {
Tablet tablet = new Tablet( i );
tablet.setQueue( orderQueue );
tabletList.add( tablet );
}
//рандосные заказы
Thread thread = new Thread( new RandomOrderGeneratorTask( tabletList, ORDER_CREATING_INTERVAL ) );
thread.start();
try {
Thread.sleep( 1000 );
}
catch (InterruptedException e) {
ConsoleHelper.writeMessage(e.getMessage());
}
thread.interrupt();
//планшет директора
DirectorTablet directorTablet= new DirectorTablet();
directorTablet.printAdvertisementProfit();
directorTablet.printCookWorkloading();
directorTablet.printActiveVideoSet();
directorTablet.printArchivedVideoSet();
}
}
DirectorTablet
public class DirectorTablet {
/**
* какую сумму заработали на рекламе, сгруппировать по дням;
*/
public void printAdvertisementProfit(){
Map<Date, Double> mapProfit = StatisticManager.getInstance().calculateProfit();
double amount = 0.00;
SimpleDateFormat simpleDateFormat = new SimpleDateFormat( "dd-MMM-yyyy", Locale.ENGLISH );
for (Map.Entry<Date, Double> map : mapProfit.entrySet()) {
System.out.println(simpleDateFormat.format(map.getKey()) + " - " + String.format(Locale.ENGLISH, "%(.2f", map.getValue()));
amount += map.getValue();
}
ConsoleHelper.writeMessage( "Total - " + String.format(Locale.ENGLISH, "%(.2f", amount) );
}
/**
* загрузка (рабочее время) повара, сгруппировать по дням
*/
public void printCookWorkloading(){
Map<Date, TreeMap<String, Integer>> mapCookWork = StatisticManager.getInstance().calculateTimeOfWork();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat( "dd-MMM-yyyy", Locale.ENGLISH );
List<Date> list = new ArrayList<>( mapCookWork.keySet() );
Collections.sort( list );
Collections.reverse( list );
for (Date date : list) {
ConsoleHelper.writeMessage( simpleDateFormat.format( date ) );
Map<String, Integer> mapSI = mapCookWork.get( date );
List<String> listOfNames = new ArrayList<>( mapSI.keySet() );
Collections.sort( listOfNames );
for (String name : listOfNames) {
ConsoleHelper.writeMessage(name + " - " + (int) Math.ceil(mapSI.get(name)) + " min");
}
ConsoleHelper.writeMessage("");
}
}
//список активных роликов и оставшееся количество показов по каждому;
public void printActiveVideoSet() {
List<Advertisement> list = StatisticAdvertisementManager.getInstance().getListOfActiveAD();
Collections.sort( list, new Comparator<Advertisement>() {
@Override
public int compare(Advertisement o1, Advertisement o2) {
return o1.getName().compareToIgnoreCase( o2.getName() );
}
} );
for (Advertisement ad : list) {
ConsoleHelper.writeMessage( ad.getName() + " - " + ad.getHits() );
}
}
//список неактивных роликов (с оставшемся количеством показов равным нулю).
public void printArchivedVideoSet() {
List<Advertisement> list = StatisticAdvertisementManager.getInstance().getListOfPassAD();
Collections.sort( list, new Comparator<Advertisement>() {
@Override
public int compare(Advertisement o1, Advertisement o2) {
return o1.getName().compareToIgnoreCase( o2.getName() );
}
} );
for (Advertisement ad : list) {
ConsoleHelper.writeMessage( ad.getName() );
}
}
}
Cook
public class Cook extends Observable implements Runnable {
private String name; //имя повара
private boolean busy; //занятость повара
private LinkedBlockingQueue<Order> queue;
private boolean stopped = false;
private boolean cathced = false;
public void setQueue(LinkedBlockingQueue<Order> queue) {
this.queue = queue;
}
public Cook (String name) {
this.name = name;
}
@Override
public String toString() {
return name;
}
//повар начинает готовить (приготовление занимает 10-кратный размер от времени приготовления заказа)
public void startCookingOrder(Order order) {
busy = true;
ConsoleHelper.writeMessage("Start cooking - " + order + ", cooking time " + order.getTotalCookingTime() + "min");
StatisticManager.getInstance().register( new CookedOrderEventDataRow( order.getTablet().toString(), name, order.getTotalCookingTime() * 60, order.getDishes() ) );
try {
Thread.sleep( order.getTotalCookingTime() * 10 );
}
catch (InterruptedException e) {ConsoleHelper.writeMessage(e.getMessage());}
setChanged();
notifyObservers(order);
busy = false;
}
public boolean isBusy() {
return busy;
}
//каждые 10 миллисекунд проверять очередь. Если в очереди есть заказы, то найти свободных поваров и передать им заказы (метод startCookingOrder), если нет свободных поваров или нет заказов в очереди, то ждать дальше.
@Override
public void run() {
while (!stopped) {
try {
Thread.sleep( 10 );
}
catch (InterruptedException e) {}
if (queue.peek()!=null) {
if (!this.isBusy()) {
try {
Order order = queue.take();
if (order != null) {
startCookingOrder( order );
}
}
catch (InterruptedException e) {
cathced= true;
}
}
if (cathced&&queue.isEmpty()) stopped=true;
}
}
}
}