Java同时生成无限量的对象

时间:2013-12-24 12:28:59

标签: java multithreading concurrency wait

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

我有几个课程PersonElevatorElevatorCall& ElevatorCallQueue

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

  2. ElevatorCall我只有 getters setters 作为收集和目标楼层

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

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

    < / LI>

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

    修改

    Here is the code to the elevator class有人说我应该发布一些代码。但是我不确定发布什么代码所以我认为我只是放入整个班级

1 个答案:

答案 0 :(得分: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();
   }
 }
嗯..你能看出这与你的问题有什么关系吗?你已经解决了一半问题。

电梯充当了liftCalls的消费者,你似乎正在努力与谁合作。这是运行ElevatorCall生产者的新线程的工作。看看你是否可以解决剩下的问题。