And*_*art 9 java concurrency multithreading wait
所以我需要制作一个电梯模拟器,我想知道如何不断地让人们打电话给电梯.我需要这个永远继续下去.所以基本上创建一个人并呼叫电梯.所有这些电话都被跟踪,但我想我需要跟踪实际上在电梯上的人.
我有几个班Person,Elevator,ElevatorCall和ElevatorCallQueue.
在Person中,我有一个run()方法,它基本上使用当前楼层和目的地楼层进行电梯呼叫,然后我有一个BlockingQueue我打电话的方法.这个run方法只运行true.
在ElevatorCall我只有收集和目的地楼层的getter和setter
在ElevatorCallQueue中,我有MAX_CALLS和numberOfPeople的变量.我有一个BlockingQueue<ElevatorCall> queue = new ArrayBlockingQueue<ElevatorCall>(MAX_CALLS)
和一个List<Person>
我在列表中添加人员,我浏览列表并run()在每个人上启动方法.最后,我创建了一个电梯并提供队列,然后运行它.
在电梯我有BlockingQueue<ElevatorCalls>.我在while(true这里也有a ),在里面我做了一个ArrayList<ElevatorCall>然后我使用了ArrayList<ElevatorCalls>作为参数的BlockingQueues drainTo方法.该run()方法的其余部分基本上遍历数组列表并执行电梯所做的事情,因此它转到第一个按下的按钮,检查每个楼层的人员以及它是否是目的地楼层.
现在我已经卡住了,不知道从哪里开始.我需要一些人们如何连续添加并呼叫电梯,并且如果没有更多呼叫,让电梯等待.如果有人能帮助我朝着正确的方向前进,我将不胜感激.谢谢
编辑
这是电梯类的代码,因为有人说我应该发布一些代码.但是我不确定要发布什么代码,所以我想我只是放入整个班级
我认为每个人都很快就接受了并发这个词——不要让它影响你的判断。我无法代表您的确切问题/标准,但电梯会前往楼层,唯一的干扰是新人按下按钮。那么,为什么不给电梯一个simulate(int time)执行此操作的方法,以及一个new_person(person p)将另一个人添加到队列中的方法。然后生成一个随机时间间隔,模拟电梯,添加一个具有随机楼层目的地和来源的新人,然后重复。
但你说它必须是并发的 -
那么您的问题似乎是电梯呼叫从哪里来?
这是典型的生产者消费者模式的一个实例。你问什么?嗯,BlockingQueue 的 Oracle 文档提供了一个比我以前能提供的更好的例子
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();
}
}
Run Code Online (Sandbox Code Playgroud)
嗯..你能看出这与你的问题有什么关系吗?你已经解决了一半了。
电梯充当电梯呼叫的消费者,您似乎正在努力解决谁产生它们。这是运行 ElevatorCall 生产者的新线程的作业。看看你能否解决剩下的问题。