пятница, 12 февраля 2010 г.

Cook as thread

Продолжают поступать вопросы и это приятно)

Как и ожидалось, у коллег возникли проблемы с потоками. В качестве помощи опубликую набросок одной из возможных реализаций повара.


package com.blogspot.jcourses;

import java.util.*;

public class Cook implements Runnable {
private boolean isWork;
private LinkedList dishes;
public Cook(){
dishes = (LinkedList) Collections.synchronizedCollection(
new LinkedList()
);
}
@Override
public void run() {
isWork = true;
while(isWork){
//TODO а есть ли блюда?)
prepareDish(dishes.getFirst());
}
}

public void addDish(String dishName){
Dish dish = new Dish(); // TODO here must be something another)
dishes.addLast(dish);
}
public void stopWork(){
isWork = false;
}
private void prepareDish(Dish first) {
//TODO write here something
}
}


Несколько слов о реализации. Есть один повар, который содержит блюда и статус характерезующий, а не халявит ли повар.
В конструкторе присутствует очень хитромудрая конструкция. Она нужна для того, что бы гарантировать что одновременно никто не получит доступ к коллекции иначе могут возникнуть осложнения. Повар готовить блюда из этого списка по очереди до тех пор, пока не вызовут метод stopWork().
Официант может вызывать метод addDish() и добавлять блюда в очередь.
Обратите внимания на комментарии - ими помечены участки кода, куда явно надо чего-нибудь дописать + надо добавить шаблоны для коллекции, так-что я не коим образом не отнимаю дз)

Готов быть разорванным вопросами.

2 комментария:

  1. нет, отнимаешь! отдай обратно!!

    ОтветитьУдалить
  2. тут небольшая ошибка/ isWork данном случае всегда "тру" и значит будет бесконечно крутиться

    @Override public void run() {
    isWork = true;
    while(isWork){
    ***
    }
    }

    ОтветитьУдалить