Java 不遵循代码?

标签 java

<分区>

这是我认为不遵循代码应该做什么的代码片段:

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 为真。 但是,该方法是在开始时调用的,因此“hi”应该无限期地显示多次,直到我按下“s”键。

一张图说一千个字,那我就给大家上百张图(视频)来解释我的意思: https://dl.dropbox.com/u/2792692/CodeWeird.ogv

https://dl.dropbox.com/u/2792692/CodeWeird.wmv

谁能告诉我这是怎么回事?

最佳答案

看起来 boolean 值 start 正在被另一个线程更新,但您没有将其声明为 volatile,因此循环永远不会查看更新后的值。

通过添加 println 来“修复”它只是 JVM 在获取控制台打印机的 native 系统对象时管理线程堆栈状态的方式的奇怪结果。解决方法是使 start 不稳定和/或在访问它时同步。

中建协:

从不打印:

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 秒后开始发送垃圾邮件:

private volatile boolean start = false;

关于Java 不遵循代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11570533/

相关文章:

java - 如果没有调试,为什么 Android Studio 会显示 "Waiting For Debugger"?

java - 我如何处理允许使用带有 Java 的 Selenium Webdriver 的 firefox 插件的弹出窗口

java - 如何在客户端和服务器之间同步大列表

java - 如何使用 Spring Data 在 MongoDB 中的继承字段上定义索引?

java - 为什么这两种类型不同?

java - 我如何找出哪些元素用作 cssQuery 的参数

java - 通过自定义Timsort能否有效提升这些场景下的性能?

java - 为什么 Swarm 注册 "jpa"、 "undertow"缓存容器

java - 如何在没有注释的情况下使用swagger

java - 使用Java获取Hbase中所有行的所有值