java - 设计交通灯应用程序

标签 java timer

我的老师要求我们设计一个交通灯应用程序。该应用程序将具有三个按钮:

  1. start: 启动红绿灯。当我们按下按钮时,我们看到红色圆圈,2 秒后我们看到绿色圆圈,3 秒后我们看到橙色圆圈 0.4 秒,然后我们看到红色圆圈,我们再次重复同样的事情。
  2. 停止:我们看到白色圆圈
  3. 故障:在此模式下,我们看到橙色圆圈持续 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

开始时只启用 timer1,当它发布事件时,我们将圆圈的颜色从红色更改为绿色,我们禁用 timer1 并启动 timer2

当 timer2 发布事件时,我们将圆圈的颜色从绿色更改为橙​​色。我们禁用 timer2 并启动 timer3。

当 timer3 发布事件时,我们将圆圈的颜色从橙色更改为红色。我们禁用 timer3 并启动 timer1。

当我们处于故障模式时,我们应用相同的逻辑。

最佳答案

这里的标准智慧是,如果您正在编写控制交通灯的计算机程序,您:

  • 使用尽可能简单的逻辑,以便在所有情况下都能确定其行为正确
  • 除了控制交通灯外,不要使用这台电脑做其他事情。

增加的程序复杂性通常不会导致可预测的行为。 (这会导致更多错误。)


所以标准智慧会说使用 1 个定时器,因为它更可能是健壮的。

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

我不是多线程专家,但假设每个计时器都是一个线程,我怀疑这会导致更精细的计时。这就需要线程调度器做更多的上下文切换。我们现在有 5 个独立的上下文,而不是 1 个,需要注意颜色变化的准确性。任何一个定时器在需要触发的点被切换到的概率都较低。

在最坏的情况下,假设 timer3 在触发时被忽略了 0.11 秒,您可能会出现颜色乱序。现在计时器还需要相互通信以确保我们的预期行为。由于引入了复杂性,我们必须再次增加复杂性以防止错误。

关于java - 设计交通灯应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26999854/

相关文章:

java - 创建包含 ";"字符的 cookie

java - 使用 SAX java Swing 的 XML 解析器

java - 如何延迟 Activity 启动的计时器?

javascript - 如何使用 javascript 进行日计时器?

java - 获取等差数列或等比数列中的下一个序列

java - 如何从给定日期获取整数月份并打印为月份名称格式 ("MMM")

java - 具有不同种子的 Java Random 实例是否真的会产生不同的序列,或者它们是否从同一序列的不同位置开始?

iphone - 如何在 Objective-C 中制作一个向上计数的计时器?

java - 如何在特定时间安排任务?

ios - 计时器问题呈现时间