【发布时间】:2014-01-12 16:49:10
【问题描述】:
所以我需要制作一个电梯模拟器,我想知道如何才能不断地让人们呼叫电梯。我需要这个永远持续下去。所以基本上一个人被创建并呼叫电梯。所有这些电话都会被跟踪,但我想我也需要跟踪实际在电梯上的人。
我有几门课Person、Elevator、ElevatorCall & ElevatorCallQueue。
In Person 我有一个
run()方法,它基本上使用当前楼层和目标楼层进行电梯呼叫,然后我有一个BlockingQueue进行呼叫。此 run 方法仅在 true 时运行。在
ElevatorCall我只有 getters 和 setters 用于收集和目标楼层在 ElevatorCallQueue 中,我有 MAX_CALLS 和 numberOfPeople 的变量。 我有一个
BlockingQueue<ElevatorCall> queue = new ArrayBlockingQueue<ElevatorCall>(MAX_CALLS)和List<Person>我将人员添加到列表中,然后遍历列表并在每个人上启动run()方法。最后,我创建了一个电梯并提供了队列,然后运行它。在电梯里我有
BlockingQueue<ElevatorCalls>。我在这里也有一个while(true),在其中我创建了一个ArrayList<ElevatorCall>,然后我使用BlockingQueues drainTo 方法,使用ArrayList<ElevatorCalls>作为参数。run()方法的其余部分基本上遍历数组列表并执行电梯所做的工作,因此它会转到第一个按下的按钮,检查每个楼层是否有人以及是否是目标楼层。
现在我被卡住了,不知道从这里去哪里。我需要了解人们如何不断添加和呼叫电梯,如果没有更多呼叫,让电梯等待。如果有人能帮助我朝着正确的方向前进,我将不胜感激。 谢谢
编辑
Here is the code to the elevator class 有人说我应该发布一些代码。但是我不确定要发布什么代码,所以我想我应该把整个班级都放进去
【问题讨论】:
-
@SilviuBurcea 谢谢。我试着用词来表达更多的意思。我通常只显示我拥有的代码,但这可能会更好:) 有什么建议吗?
-
您可能想尝试生产者/消费者模式。
-
并发可能不是正确的工具,尤其是因为您需要以一定的速率同步生成与消耗。如果你不这样做,你可能很快就会溢出缓冲区,你的模拟结果取决于线程调度的随机性。在“模拟步骤”中工作并生成一些 + 消耗一些的简单循环将允许您逐步模拟。每一步都算作同一时间点,因此您在此处所做的所有事情都会对观察者“同时”发生。
-
您可以为等待添加到您的模拟中的人添加一个大小有限的队列。将新人放在那里然后随机休眠一段时间的线程会产生他们。如果模拟不能及时消费,队列的大小限制可以防止人员溢出。电梯可以消耗每层排队的人。线程也可以等待条件,例如排队的人要等电梯到正确的楼层(人等电梯),电梯要等人进去,人再等正确的楼层出来。
-
请注意,您的“呼叫队列”不应是队列。您按照通过它们的顺序服务楼层,而不是按按钮的顺序。您可能正在定义您的队列等,然后才能在脑海中明确定义模型。没有理由仅仅因为存在特定的数据类型就必须使用它。
标签: java multithreading concurrency wait