2015-02-10 2 views
0

Мне нужна помощь в определении того, как закодировать эту проблему. Я сталкиваюсь.Запуск и управление ими

Я создаю симулятор лифта. Я хочу запустить каждый объект Elevator в отдельных отдельных потоках. Я хочу контролировать их с помощью объекта ElevatorController. Я представляю, как потоки лифта сидят в IDLE, а затем переключаются на UP или DOWN, когда это говорит диспетчер ElevatorController.

Я создал лифты и поместил их в массив ArrayList, который хранится в объекте Building.

Что мне делать дальше? Моя цель - сделать лифт1 отправиться на этаж 11. Пока лифт1 движется, мне нужно сказать, что лифт2 перешел на этаж 14. Когда лифт2 движется до 14-го этажа, мне нужно сначала сказать, чтобы он пошел на этаж 13.

Я не уверен, как я должен создавать эти потоки и по-прежнему ссылаюсь на объекты лифта в этих потоках, поэтому могу сообщить им новое место назначения.

Я новичок в многопоточности.

+0

«Я хочу запускать каждый объект Лифт в отдельных отдельных потоках» Почему? Это упражнение, чтобы узнать о синхронизации потоков? или это упражнение, чтобы узнать о контроле и симуляции в реальном времени? Если бы меня попросили имитировать банк лифтов, у меня, вероятно, не было нитки на лифте. Я бы смоделировал весь банк лифтов (включая их контроллер) в одном потоке, управляемом событиями, с упорядоченной по времени очереди событий. –

ответ

0

Определите каждую нить как поле в своем building, чтобы вы могли получить к нему доступ позже. Я хотел бы сделать что-то вроде:

public class ElevatorThread extends Thread { 
    public void run() { 
     while(!this.interrupted()) { 
      synchronized(this) { 
       try { 
        this.wait(); 
       } catch (InterruptedException e) { 
        return; 
       } 
      } 
      elevatorThreadRunnable.run(); 
     } 
    } 
    Runnable elevatorThreadRunnable; 
    public void setRunnable(Runnable runnable) { 
     elevatorThreadRunnable = runnable; 
     synchronized (this) { 
      this.notify(); 
     } 
    } 
} 

Если мы определим ElevatorThread S как массив становится еще проще. Мы можем просто:

building.elevatorThreads[0].setRunnable(new Runnable() { 
    public void run() { 
     ... 
    } 
}); 

Где:

//I belong in the Building constructor! 
Thread[] elevatorThreads = { 
    new ElevatorThread(), 
    new ElevatorThread(), 
    new ElevatorThread() 
    //number of elevators in building 
    /* 
     this could be simplified to a method that takes the number of threads as an int 
     and returns an inflated array, but that is outside the context of this answer 
    */ 
}; 

Если мы делаем это, наша Runnable побежал в лифте резьбы по вашему выбору. Поток также простаивает, как вы просили, до тех пор, пока не будет установлен новый Runnable.

Чтобы убить нить, мы вызываем ElevatorThread.interrupt();, это приведет к остановке потока wait() ing, если это так, а затем вырваться из цикла выполнения; убивая нить.

+0

большое спасибо. Я думаю, что понимаю, что вы говорите, и я попытаюсь реализовать это. – clenard

+0

Вы уверены, что этого не может быть достигнуто частично с помощью среды исполнителей, добавленной в Java 6? – Adam

+0

@Adam, возможно, это возможно. Для достижения цели часто существует несколько рабочих подходов. Я, по общему признанию, не знаком с исполнителями. Вы могли бы написать ответ с помощью исполнителей, чтобы поделиться знаниями. – MeetTitan

Смежные вопросы