Java одновременно генерирует бесконечное количество объектов

Итак, мне нужно сделать симулятор лифта, и мне было интересно, как я могу постоянно генерировать людей, чтобы вызвать лифт. Мне нужно, чтобы это продолжалось вечно. Поэтому в основном создается человек и называет лифт. Все эти звонки отслеживаются, но я думаю, мне нужно отслеживать людей, которые тоже находятся на лифте.

У меня есть несколько классов Person, Elevator, ElevatorCall и ElevatorCallQueue.

  • У меня есть метод run(), который в основном делает вызов лифта с текущим полом и полом назначения, а затем у меня есть BlockingQueue, на который я звоню. Этот метод запуска работает только в то время как true.

  • В ElevatorCall у меня есть getters и сеттеры для этажей для коллекции и назначения

  • В элементе ElevatorCallQueue у меня есть переменные для MAX_CALLS и numberOfPeople. У меня есть BlockingQueue<ElevatorCall> queue = new ArrayBlockingQueue<ElevatorCall>(MAX_CALLS) и a List<Person> Я добавляю людей в список, и я просматриваю список и начинаю метод run() для каждого человека. Наконец, я создаю лифт и предоставляю очередь и запускаю его.

  • В лифте у меня есть BlockingQueue<ElevatorCalls>. У меня есть и while(true), и внутри него я делаю ArrayList<ElevatorCall>, а затем я использую метод BlockingQueues drainTo, используя ArrayList<ElevatorCalls> в качестве параметра. Остальная часть метода run() в основном выполняет итерацию по списку массивов и делает то, что делает лифт, поэтому оно переходит к первой нажатой кнопке, проверяет каждый этаж для людей и, если это место назначения.

Прямо сейчас я застрял и не знаю, куда идти отсюда. Мне нужно, чтобы кто-то постоянно добавлял и звонил в лифт, а лифт ожидал, если больше не будет звонков. Был бы признателен, если бы кто-нибудь мог помочь мне в правильном направлении. Благодаря

ИЗМЕНИТЬ

Вот код класса лифта, поскольку кто-то сказал, что я должен опубликовать некоторый код. Однако я не уверен, какой код отправлять, поэтому я думал, что просто поставлю весь класс

Ответ 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. Посмотрите, сможете ли вы обойти остальные.