Введите приведенный ниже метод 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; }