当前位置: 首页 > 面试题库 >

Java不遵循代码吗?

卫深
2023-03-14
问题内容

这是我认为不遵循应执行的代码的代码段:

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在为控制台打印机获取本机系统对象时管理线程的堆栈状态的一种方式的后果。解决方法是使启动不稳定并/或在访问它时进行同步。

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;



 类似资料:
  • 这是我认为不遵循代码应该做什么的代码片段: 如果我发表评论 代码显然不起作用。如果我取消注释,它就会取消注释! 注意:只要按“s”开始游戏,启动就是真的。但是,该方法在开始时被调用,因此“hi”应该显示多次并无限期地显示,直到我按“s”键。 一张图片说一千个字,所以我给你几百张图片(视频)来解释我的意思:https://dl.dropbox.com/u/2792692/CodeWeird.ogv

  • 我尝试使用存储触发器测试gcloud函数。gcloud函数应该调用一个公共的gcloud服务,但需要身份验证。我可以在本地执行该函数而没有任何问题。但是在gcloud上,我可以在函数日志中找到一个NoClassDefFoundError。 无法执行函数。HelloGcs java。lang.NoClassDefFoundError:io/opencensus/trace/propagation/T

  • 我定义了一个布局,以便代理根据数据库中的列表从一个矩形节点移动到另一个矩形节点。因此,例如,代理1将前往“通道”701,然后前往702,等等。 布局示例 特工们从左上角进入,沿着x走到那一行的末尾,然后向下走到底部,再向右走,参观他们途中的“车道”。 然而,我注意到一个代理的第一条车道在右下角,所以它不是沿着路径穿过然后向下,而是使用最短的距离,沿着对角线直行到拐角的车道: 软件中有什么东西我可以

  • 问题内容: 因此,我正在尝试学习log4j2,并把头放在记录器及其级别和父母传播上。 当前,我的源层次结构运行是: 而我的CalculatorMain是: 我的log4j2.xml是 问题是将输出到控制台的root记录程序设置为。根据我对级别的理解,这意味着我的root记录器应仅输出错误日志或更低的错误日志。然后是我的 记录器,前者应仅记录错误并降低记录,而后者应记录跟踪并降低记录。因此,我的理解

  • 问题内容: 我觉得这里缺少明显的东西! 输出: 当然应该输出: 这是怎么了 问题答案: 字典未排序。如果需要依赖顺序,则需要一个OrderedDict- Python 2.7的模块中有一个,或者您可以使用多种食谱之一。

  • 我对一个异步函数有点拘泥于此。 我要完成的是创建一个batchProcessing函数(batchGetSubs),它将循环访问一组文件,读取一个ID,然后发出一个API请求,等待一个响应(问题),然后用格式化的数据写入一个新文件。 问题--我尝试了异步和等待,以及推送承诺和尝试使用承诺.所有这些都是为了等待承诺的解决,但没有成功。当前的行为是,在API调用实际返回所有数据之前,我获取Promis