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