设计交通灯应用程序

时间:2014-11-18 17:03:41

标签: java timer

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

  1. 开始:启动红绿灯。当我们按下按钮时,我们看到红色圆圈,看到绿色圆圈后2秒,看到橙色圆圈0.4秒后3秒,然后我们看到红色圆圈,我们再次重复相同的事情。
  2. 停止:我们看到白圈
  3. 细分:在这种模式下,我们看到橙色圆圈持续0.5秒,然后是白色圆圈持续0.6秒,再次看到橙色圆圈。
  4. 第一个问题是我们应该使用多少计时器。我回答说我们只能使用一个定时器,每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。

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

2 个答案:

答案 0 :(得分:2)

这里的标准智慧是,如果你正在编写一个控制红绿灯的计算机程序,你:

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

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


所以标准的智慧会说使用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秒被忽略,你可能会出现颜色乱序。现在,计时器还需要相互通信以确保我们的预期行为。由于引入了复杂性,我们必须再次提高复杂性以防止错误。

答案 1 :(得分:0)

我根本不会使用计时器。对于这种应用,你最好看ScheduledExecutorService