Java 时钟线程-奇怪的bug system.out.println
我有我的线Java 时钟线程-奇怪的bug system.out.println,java,multithreading,swing,listeners,Java,Multithreading,Swing,Listeners,我有我的线 this.clock = new JLabel(); clockThread = new Thread(new Runnable() { public void run() { clockRun(); } }); clockThread.start(); this.clock.addMouseListener(new MouseAdapter() { @Override public void
this.clock = new JLabel();
clockThread = new Thread(new Runnable() {
public void run() {
clockRun();
}
});
clockThread.start();
this.clock.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (clockDisplayRealTime) {
clockDisplayRealTime = false;
} else {
clockDisplayRealTime = true;
}
}
});
除非我有下面的System.out.println,否则这将不起作用
我在挠头,想知道出了什么问题。请帮帮我。谢谢
public void clockRun() {
while (true) {
System.out.println(clockDisplayRealTime);
if (clockDisplayRealTime) {
Date date = new Date();
clockRealtime = date.getTime();
this.clock.setText(sdf.format(clockRealtime));
}
}
}
需要易变的
volatile private boolean clockDisplayRealTime = false;
这个问题重复了Swing组件只应在上进行变异 解决你的问题最简单的方法可能是一个简单的方法。您也可以按如下方式手动操作:
clockThread = new Thread(() -> {
while (true) {
if (clockDisplayRealTime) {
SwingUtilities.invokeAndWait(() -> {
Date date = new Date();
clockRealtime = date.getTime();
this.clock.setText(sdf.format(clockRealtime));
});
Thread.sleep(1000); // no need to update the UI more often than that
}
}
});
代码失败的原因是多个线程访问同一字段时没有同步,在这种情况下,Java内存模型不能保证一个线程所做的更改对另一个线程可见。通过将访问clockDisplayRealTime字段的所有代码放在同一个线程中,您可以巧妙地避开这个问题。可能是更新太快了?是的!同意@cricket\u 007-将日志语句添加到
mouseClicked()
中,以及使用什么初始化clockDisplayRealTime
?我还想在clockRun()
中添加Thread.sleep(200)
,否则,为了显示一些文本,您需要对CPU进行大量的修改。由于Swing不是线程安全的,所以最好使用Swing计时器或SwingWorker
而不是普通的线程,这样你就可以更好地控制开关。你可能想读一读,按照建议,<代码> PrimTrn()<代码>可以偷偷摸摸地同步你的错误代码。你可以考虑使用<代码> AtomicBoolean <代码>,我不知道,我认为Swing <代码>定时器< /代码>会更容易,您可以使用定时器启动和停止SwingUtilities.invokeAndWait(()->{必须测试EDT,从isEventDIspatchThread返回时必须有false…,否则RepainManager返回异常