Ответ 1
Я думаю, что все очень быстро подскочили к слову concurrency - не позволяйте ему омрачать ваше мнение. Я не могу говорить от имени вашей конкретной проблемы/критериев, но лифт идет по пути на полы, и единственным нарушением является новый человек, нажимая кнопку. Итак, почему бы не дать элементу метод simulate(int time)
, который делает это, и метод new_person(person p)
, который добавляет другого человека в очередь. Затем просто создайте случайный временной интервал, имитируйте лифт, добавьте нового человека со случайным полом и источником, а затем повторите.
Но вы говорите, что он должен быть параллельным -
Хорошо, ваш вопрос, откуда берутся лифты?
Это пример типичного шаблона потребителя. Что ты спрашиваешь? Ну документация оракула для BlockingQueue дает лучший пример, чем я когда-либо мог
class Producer implements Runnable {
private final BlockingQueue queue;
Producer(BlockingQueue q) { queue = q; }
public void run() {
try {
while (true) { queue.put(produce()); }
} catch (InterruptedException ex) { ... handle ...}
}
Object produce() { ... }
}
class Consumer implements Runnable {
private final BlockingQueue queue;
Consumer(BlockingQueue q) { queue = q; }
public void run() {
try {
while (true) { consume(queue.take()); }
} catch (InterruptedException ex) { ... handle ...}
}
void consume(Object x) { ... }
}
class Setup {
void main() {
BlockingQueue q = new SomeQueueImplementation();
Producer p = new Producer(q);
Consumer c1 = new Consumer(q);
Consumer c2 = new Consumer(q);
new Thread(p).start();
new Thread(c1).start();
new Thread(c2).start();
}
}
Хм.. Вы видите, как это относится к вашей проблеме? Вы уже решили половину этого.
The Elevator действует как потребитель лифта, вы, похоже, боретесь с тем, кто их производит. Это работа для нового потока, в котором работают производители ElevatorCall. Посмотрите, сможете ли вы обойти остальные.