Java同时生成无限量的对象

And*_*art 9 java concurrency multithreading wait

所以我需要制作一个电梯模拟器,我想知道如何不断地让人们打电话给电梯.我需要这个永远继续下去.所以基本上创建一个人并呼叫电梯.所有这些电话都被跟踪,但我想我需要跟踪实际上在电梯上的人.

我有几个班Person,Elevator,ElevatorCall和ElevatorCallQueue.

  1. 在Person中,我有一个run()方法,它基本上使用当前楼层和目的地楼层进行电梯呼叫,然后我有一个BlockingQueue我打电话的方法.这个run方法只运行true.

  2. 在ElevatorCall我只有收集和目的地楼层的getter和setter

  3. 在ElevatorCallQueue中,我有MAX_CALLS和numberOfPeople的变量.我有一个BlockingQueue<ElevatorCall> queue = new ArrayBlockingQueue<ElevatorCall>(MAX_CALLS) 和一个List<Person> 我在列表中添加人员,我浏览列表并run()在每个人上启动方法.最后,我创建了一个电梯并提供队列,然后运行它.

  4. 在电梯我有BlockingQueue<ElevatorCalls>.我在while(true这里也有a ),在里面我做了一个ArrayList<ElevatorCall>然后我使用了ArrayList<ElevatorCalls>作为参数的BlockingQueues drainTo方法.该run()方法的其余部分基本上遍历数组列表并执行电梯所做的事情,因此它转到第一个按下的按钮,检查每个楼层的人员以及它是否是目的地楼层.

现在我已经卡住了,不知道从哪里开始.我需要一些人们如何连续添加并呼叫电梯,并且如果没有更多呼叫,让电梯等待.如果有人能帮助我朝着正确的方向前进,我将不胜感激.谢谢

编辑

这是电梯类的代码,因为有人说我应该发布一些代码.但是我不确定要发布什么代码,所以我想我只是放入整个班级

use*_*280 2

我认为每个人都很快就接受了并发这个词——不要让它影响你的判断。我无法代表您的确切问题/标准,但电梯会前往楼层,唯一的干扰是新人按下按钮。那么,为什么不给电梯一个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 生产者的新线程的作业。看看你能否解决剩下的问题。