ожидание на Яве - PullRequest
       2

ожидание на Яве

1 голос
/ 29 декабря 2011

У меня есть Java-программа, которая имитирует автомобильную структуру. Я написал объяснение, но это было бы довольно сложно понять и не очень полезно, поэтому я просто задам «абстрактный» вопрос.

У меня есть бесконечный цикл, который вызывает метод "сейчас", который говорит фабрике построить новую машину.

    while(true){
        try{
            Thread.sleep(500);
        }catch (Exception e) {;}
        fabric.now();
    }

Внутри ткани есть 3 зоны; стадия 0, где создается кузов автомобиля, стадия 1, где автомобиль снабжен огнями, стадия 2, на которой я наложил бампер, и готово, то есть место, где размещены все готовые автомобили.

Когда метод now вызывается в первый раз, он создает кузов автомобиля на стадии 0. Затем, когда он вызывается во второй раз, он перемещает первое тело на стадию 1, он помещает огни автомобиля (рисуя два круга) и это создает новый кузов. Так будет продолжаться до тех пор, пока автомобиль не будет готов, то есть когда он будет перемещен в готовую зону.

Вот моя проблема. Во второй раз, когда я вызываю метод now, он выполняет 3 вещи:

я. окрашивает кузов в 1 этап
II. окрашивает новый кузов в 0 этап
III. на 1-й ступени закрашивает огни над кузовом.

Я хочу отложить шаг (iii), чтобы люди могли видеть, что машина снабжена огнями. Если я использую wait, thread.sleep или выполняю цикл, который занимает x миллисекунд, то с этого момента задерживается вся структура. Я думаю, что мне нужно вывести шаг (iii) из нормального потока и сделать это отдельно, поэтому, когда я жду 350 миллисекунд, прежде чем покрасить свет, это не задерживает остальную часть процесса изготовления. (остальная часть картины).

Есть идеи?

Ответы [ 2 ]

3 голосов
/ 29 декабря 2011

Вот мое предположение о вашем вопросе: Вы хотите вызывать метод now () с регулярным интервалом, скажем, 500 мс. Теперь независимо от того, хотите ли вы отложить подзадачу 3 внутри now (). Это также означает, что задержка в подзадаче 3 не должна задерживать вызов now () каждые 500 мс

Если это ваше требование, то я предлагаю вам использовать java.util.Timer.scheduleAtFixedRate

Просто создайте TimerTask и поместите в него вызов now ().

Используйте wait (500) или сколько хотите в подзадаче 3.

0 голосов
/ 29 декабря 2011

Это несколько сложнее, но должно хорошо масштабироваться.

  1. Реализация очереди событий
  2. Пусть каждое событие выполняет соответствующие вызовы функций, а затем добавляет следующие события вочередь
  3. Вы можете расширять, создавая больше событий (например, запуск или разборка)

    interface QueueEvent{
      void perform(EventQueue q);
    }
    
    class Stage0CarEvent implements QueueEvent{
      public void perform(EventQueue q){
        fabric.drawStage0Car();
        q.push(new Stage1CarEvent(),500);
      }
    }
    
    class Stage1CarEvent implements QueueEvent{
      public void perform(EventQueue q){
        fabric.drawStage1Car();
        q.push(new AddLightsEvent(),350);
        q.push(new Stage2CarEvent(),500);
      }
    }
    
    // other events...
    
    class EventQueue{
      void run(){
        while(true){
          // get the next event
          // wait an amount of time needed for the next event
          event.perform(this);
        }
      }
    
      void push(QueueEvent event,int t){
        //insert the next event t time units from now
      }
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...