这是我认为不遵循代码应该执行的操作的代码片段:
public void updateTimeElapsed() {
timeElapsedLabel.setText("Time elapsed: " + ((System.nanoTime() - time) / Math.pow(10, 9)));
}
public void updateTimeElapsedIndefinitely() {
while (true) {
//System.out.println("Hi");
//TODO: Why this no work?
if (start) { System.out.println("Shoulda'"); updateTimeElapsed(); }
}
}
如果我评论
System.out.println("Hi")
该代码显然不起作用。
如果我取消注释,那么它就会!
笔记:
当您按下 's' 开始游戏时,start 为 true。
但是,该方法是在开始时调用的,因此“hi”应该无限期地显示多次,直到我按“s”键。
一张图片说一千个字,所以我会给你数百张图片(视频)来解释我的意思:https://dl.dropbox.com/u/2792692/CodeWeird.ogv
https://dl.dropbox.com/u/2792692/CodeWeird.wmv
谁能告诉我发生了什么事吗?
看起来像布尔值start
正在由另一个线程更新,但您没有将其声明为volatile
,因此循环从不查看更新后的值。
通过添加 println 来“修复”它只是 JVM 在获取控制台打印机的本机系统对象时管理线程堆栈状态的方式的一个奇怪的结果。修复方法是使 start 变得不稳定和/或围绕访问它进行同步。
SCCE:
从不打印:
public class Testit {
public static void main(String[] args) {
busted t = new busted();
t.start();
try {
Thread.sleep(1000L);
} catch (Exception e) {}
t.startUpdating();
}
public static class busted extends Thread {
private boolean start = false;
public void startUpdating() {
start = true;
}
@Override
public void run() {
updateTimeElapsedIndefinitely();
}
public void updateTimeElapsedIndefinitely() {
while (true) {
if (start) {
System.out.println("Hello");
}
}
}
}
}
1 秒后开始向 Hello 发送垃圾邮件,方法如下:
private volatile boolean start = false;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)