Java руководство для начинающих - Шилдт Герберт (2012)
-
Год:2012
-
Название:Java руководство для начинающих
-
Автор:
-
Жанр:
-
Оригинал:Английский
-
Язык:Русский
-
Издательство:Вильямс
-
Страниц:316
-
ISBN:978-5-8459-1770-6
-
Рейтинг:
-
Ваша оценка:
Java руководство для начинающих - Шилдт Герберт читать онлайн бесплатно полную версию книги
Введите приведенный ниже метод run (), начинающий имитацию автоматизированного светофора.
// Запуск имитации автоматизированного светофора,
public void run () {
while(!stop) {
try {
switch(tic) {
case GREEN:
Thread.sleep(10000); // Зеленый на 10 секунд
break;
case YELLOW:
Thread.sleep(2000); // Желтый на 2 секунды
break;
case RED:
Thread.sleep(12000); // Красный на 12 секунд
break;
}
} catch(InterruptedException exc) {
System.out.println(exc);
}
changeColor();
}
}
Этот метод переключает цвета светофора по очереди. Сначала выполнение потока приостанавливается на заданный промежуток времени, который выбирается в зависимости от конкретного цвета светофора. Затем вызывается метод changeColor (), переключающий цвет светофора.
Введите приведенный ниже метод changeColor (), переключающий цвет светофора.
// Переключение цвета светофора,
synchronized void changeColor() {
switch(tic) {
case RED:
tic = TrafficLightColor.GREEN;
break;
case YELLOW:
tic = TrafficLightColor.RED;
break;
case GREEN:
tic = TrafficLightColor.YELLOW;
}
changed = true;
notify(); // уведомить о переключении цвета светофора
}
В операторе switch проверяются сведения о цвете светофора, хранящиеся в переменной tic, после чего этой переменной присваивается другой цвет. Обратите внимание на то, что этот метод синхронизирован. Это необходимо потому, что он вызывает метод notify (), уведомляющий о смене цвета. (Напомним, что обратиться к методу notify () можно только из синхронизированного контекста.)
Далее введите метод wait For Change (), ожидающий переключения цвета светофора. // Ожидание переключения цвета светофора,
synchronized void waitForChange() {
try {
while(!changed)
wait(); // ожидать переключения цвета светофора
changed = false;
} catch(InterruptedException exc) {
System.out.println(exc);
}
}
Действие этого метода ограничивается вызовом метода wait (). Возврат из него не произойдет до тех пор, пока в методе changeColor () не будет вызван метод notify (). Следовательно, метод waitForChange () не завершится до переключения цвета светофора.
И наконец, введите метод getColor (), возвращающий текущий цвет светофора, а вслед за ним — метод cancel (), останавливающий имитацию светофора, присваивая переменной stop логическое значение true. Ниже приведен исходный код обоих методов.
// Возврат текущего цвета.
TrafficLightColor getColor() {
return tic;
}
// Прекращение имитации светофора.
void cancel () {
stop = true;
}
Ниже приведен весь исходный код программы, имитирующей автоматизированный светофор с помощью перечисления.
// Пример для опробования 12.1.
// Имитация автоматизированного светофора с помощью
// перечисления, описывающего переключаемые цвета светофора.
// Перечисление, представляющее состояния светофора,
enum TrafficLightColor {
RED, GREEN, YELLOW
}
// Имитация автоматизированного светофора,
class TrafficLightSimulator implements Runnable {
private Thread thrd; // Поток для имитации светофора
private TrafficLightColor tic; // Текущий цвет светофора
boolean stop = false; // Остановка имитации, если истинно
boolean changed = false; // Переключение светофора, если истинно
TrafficLightSimulator(TrafficLightColor init) {
tic = init;
thrd = new Thread(this);
thrd.start();
}
TrafficLightSimulator() {
tic = TrafficLightColor.RED;
thrd = new Thread(this);
thrd.start();
}