2

我不明白为什么在下面的代码中使用这样的计时器变量。

问题一:在startTimer()和stopTimer()中,都有一个局部变量aTimer要在对定时器的操作之前使用,目的是什么?

问题2:在stopTimer()中,timer会被赋值为null,所以如果timer不为null,说明这个timer已经被创建,当startTimer()被调用时,timer不会被再次创建。这是检查计时器是否正在运行的最佳做法吗?通过将 null 分配给计时器,PMD 还报告“NullAssignment”违规

private Timer timer;

private void startTimer() {
  if (timer == null) {
    Timer aTimer = timerFactory.createTimer(100000, null);
    aTimer.setListener(this);
    timer = aTimer;
  }
}

private void stopTimer() {
  if (timer != null) {
    Timer aTimer = timer;
    timer = null;
    aTimer.cancel();
    aTimer.setListener(null);
 }
}

public void start() {
  synchronized(..) {
     startTimer();
  }
}

public void stop() {
 synchronized(..) {
     stopTimer();
 }
}
4

3 回答 3

1

您的代码相当于:

private boolean started = false;
private Timer timer;

public synchronized void start() {
    if (!started) {
        timer = timerFactory.createTimer(100000, null);
        timer.setListener(this);
        started = true;
    }
}

public synchronized void stop() {
    if (started) {
        timer.cancel();
        timer.setListener(null);
        started = false;
    }
}

这更短,更容易理解(恕我直言)。局部变量是多余的,因为您的代码是同步的,并且timer两个线程不能同时访问您的变量。

timer并且使用is作为已启动/未启动标志的事实null对于如此短的代码很好,但随着添加更多行,它会变得混乱。我更喜欢一个started不言自明的正确标志。

于 2013-07-15T10:02:50.650 回答
0

我的假设是这个对象的原作者想要封装 Timer 对象,这样你就不会在 start() 和 stop() 之间错误地重新创建它。

这没有直接的附加价值,但如果与一大群人一起处理经常使用的对象,可能是为了防止不必要的访问弄乱信息,或者其他什么。

于 2013-07-12T08:25:03.177 回答
0

定时器是同步的,以防止线程干扰和内存一致性错误。同步计时器意味着:

  • 没有来自其他线程的线程干扰
  • 确保内存一致性
  • 确保对定时器的原子访问,其中定时器的外部线程不能访问定时器的中间状态。即要么完成动作,要么根本没有动作。
于 2013-07-12T08:35:21.463 回答