Разработка приложения светофора
Мой учитель попросил нас разработать приложение для светофора. Приложение будет иметь три кнопки:
- начало: чтобы начать светофор. Когда мы нажимаем кнопку, мы видим красный круг, через 2 секунды после того, как мы видим зеленый круг, через 3 секунды после того, как мы видим оранжевый круг в течение 0,4 секунды, а затем мы видим красный круг и повторяем то же самое снова.
- стоп: мы видим белый круг
- разбивка: в этом режиме мы видим оранжевый круг в течение 0,5 секунд, затем белый круг в течение 0,6 секунд и снова оранжевый круг.
Первый вопрос - сколько таймера нам нужно использовать. Я ответил, что мы можем использовать только один таймер, который будет публиковать события каждые 0,1 секунды. Учитель сказал, что это плохая идея, и мы должны использовать 5 таймеров. Он сказал, что у меня будут проблемы, если я запустлю много программ на моей машине (перегрузка).
Почему мое решение не хорошо? Использование многих таймеров не усложнит решение?
Редактировать:
Он сказал, что нам нужно 5 таймеров, потому что есть 5 событий (с красного на зеленый, с зеленого на оранжевый, с оранжевого на красный, с оранжевого на белый, с белого на оранжевый). Он сказал, что если мы добавим больше цветов, мы добавим и таймеры.
Вот его логика:
timer1 has interval of 2 seconds
timer2 has interval of 3 seconds
timer3 has interval of 0.4 seconds
timer4 has interval of 0.5 seconds
timer5 has interval of 0.6 seconds
При запуске активирован только таймер1, когда он публикует событие, мы меняем цвет круга с красного на зеленый, отключаем таймер1 и запускаем таймер2
Когда timer2 публикует событие, мы меняем цвет круга с зеленого на оранжевый. Мы отключаем timer2 и запускаем timer3.
Когда timer3 публикует событие, мы меняем цвет круга с оранжевого на красный. Мы отключаем timer3 и запускаем timer1.
Мы применяем ту же логику, когда находимся в режиме пробоя.
2 ответа
Принято считать, что если вы пишете компьютерную программу, управляющую светофором, вы:
- используйте простейшую возможную логику, чтобы можно было определить правильное поведение во всех случаях
- и не используйте этот компьютер для других целей, кроме управления светофором.
Повышенная сложность программы обычно не приводит к предсказуемому поведению. (Это приводит к большему количеству ошибок.)
Таким образом, стандартная мудрость гласит, что нужно использовать 1 таймер, потому что он более надежен.
таймер1 имеет интервал 2 секунды таймер2 имеет интервал 3 секунды таймер3 имеет интервал 0,4 секунды таймер4 имеет интервал 0,5 секунды таймер5 имеет интервал 0,6 секунды
Я не эксперт по многопоточности, но, предполагая, что каждый таймер является потоком, я сомневаюсь, что это приведет к более детальному учету времени. Это требует, чтобы планировщик потока сделал больше переключения контекста. Теперь у нас есть 5 отдельных контекстов, в отличие от 1, требующих внимания, чтобы изменения цвета были точными. Вероятность того, что какой-либо таймер будет переключен в точку, в которой он должен срабатывать, ниже.
В худшем случае, скажем, timer3
пренебрегают для 0.11
секунд, в то время как это должно сработать, цвета могут появляться не по порядку. Теперь таймеры должны также общаться друг с другом, чтобы обеспечить наше предполагаемое поведение. Из-за введенной сложности мы должны еще раз увеличить сложность, чтобы избежать ошибок.
Я бы не использовал таймер вообще. Вам лучше было бы посмотреть на ScheduledExecutorService для такого рода приложений.