2013-12-20 3 views
1

У меня есть задание в параллельном программировании, и мне интересно, как я могу что-то сделать. У меня должен быть симулятор лифта, где люди называют лифты, лифты будут собирать их и доставлять их до места назначения. Когда лифт ничего не делает, он спит, и у Человека будет способ разбудить лифт (нажав кнопку).Java Concurrency wake up thread

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

В моем главном классе у меня есть это прямо сейчас:

new Thread(elevators[0]).start(); 

    panels[3].pressButton().getButtonPanel().pressButton(5); 
    panels[1].pressButton().getButtonPanel().pressButton(0); 
    panels[2].pressButton().getButtonPanel().pressButton(4); 

У меня также есть множество людей, но я хочу, чтобы быть что-то генерируется постоянно и беспорядочно. Итак, в классе Person они разбудят лифт, но как я могу заставить лифт спать навсегда здесь? Спасибо за любую помощь.

ответ

2

Чтобы запустить навсегда, просто поместите весь свой код внутри цикла while(true). Чтобы остановить его, вы можете использовать разрыв при правильных условиях. В качестве альтернативы (и для получения более чистого кода) используйте цикл while(condition), где ваше условие получает от истины значение false с помощью некоторого метода, который вы можете вызвать. Например есть все это в вашем классе:

boolean shouldBeRunning = true; 

(...) 

while(shouldBeRunning){ 
    //all the logic here 
} 

(...) 

public void stop(){ 
    this.shouldBeRunning = false; 
} 

Чтобы Elewator ждет, пока кто-нибудь не называет его, используйте метод wait(). Ожидающий поток может быть «проснулся», если другой поток вызывает notify на мониторе официантов. Получите дополнительную информацию о wait() и notify, чтобы получить более полное представление об этом. Впоследствии реализация не должна быть проблемой.

+0

Спасибо за ответ. Я знал, что могу использовать wait (true) для запуска навсегда, это была главным образом реализация постоянно создаваемых новых людей, на которых я не был уверен. Если я создаю потоки в моем основном методе, могу ли я разбудить поток лифта внутри класса Person? – AndyOHart

+1

Ну, на самом деле вы можете только вызывать уведомление только из потока, которому принадлежит блокировка. Но как насчет нерестового потока элеватора внутри основного класса? – 3yakuya

+0

Нить лифта запускается и запускается в основном потоке. Куда мне идти оттуда? – AndyOHart