Java 将线程置于等待状态后,计时器继续运行

Java 将线程置于等待状态后,计时器继续运行,java,multithreading,Java,Multithreading,这里发生了什么?每当我按下开始按钮,它就从我的JLabel上的00:00:000开始计数(很好,这就是我想要的)。按下停止按钮后,说00:10:000,我在00:10:000看到我的JLabel(很好,这就是我想要的)。好的,问题来了,每当我再次按下开始按钮,我希望它在00:10:000开始。但事实并非如此,因为计数器一直在后台运行。假设我的JLabel站在00:10:000,等待准确的00:07:000,然后再次按下开始按钮,它从00:17:000开始再次计数。有人能帮我吗?提前谢谢 priv

这里发生了什么?每当我按下开始按钮,它就从我的JLabel上的00:00:000开始计数(很好,这就是我想要的)。按下停止按钮后,说00:10:000,我在00:10:000看到我的JLabel(很好,这就是我想要的)。好的,问题来了,每当我再次按下开始按钮,我希望它在00:10:000开始。但事实并非如此,因为计数器一直在后台运行。假设我的JLabel站在00:10:000,等待准确的00:07:000,然后再次按下开始按钮,它从00:17:000开始再次计数。有人能帮我吗?提前谢谢

private boolean isRunning;
private boolean isWaiting;

public void run()
{
    long calibration1 = System.currentTimeMillis();

    try
    {
        while(isRunning == true) //start button
        {
            long yourmilliseconds1 = System.currentTimeMillis();
            SimpleDateFormat sdf1 = new SimpleDateFormat("mm:ss:SSS");

            System.out.println(sdf1.format(yourmilliseconds1 - calibration1));
            String outputTimer = sdf1.format(yourmilliseconds1 - calibration1);

            timerLabel.setText(outputTimer);

            if(isWaiting == true) // stop button        
            {
                synchronized(this)
                {
                    wait(); //if start button is pressed again it will notify() (no need for code)                  }
            }
        }
    }

    catch(InterruptedException e)
    {

    }   
}

public void startButton()
{
    isWaiting = false;
    isRunning = true;
}

public void stopButton()
{
    isWaiting = true;
    isRunning = false;
}

使用
AtomicBoolean
或将
boolean
设置为volatile(我发现
AtomicBoolean
更可靠)volatile不起作用,但我将尝试使用AtomicBoolean。感谢您的回复哦,我还应该指出您在事件调度线程的内容之外更新
timerLabel
违反了Swing的单线程规则。如果改用摆动计时器,解决方案将更简单、更安全。有关更多详细信息,请参阅AtomicBoolean不适用于,因此我现在将尝试使用Swing计时器。谢谢仅供参考:您从未调用
notify
退出
wait
调用…但这假设您只有一个计时器实例