当前位置: 首页 > 知识库问答 >
问题:

定时循环未终止 [重复]

乌灿
2023-03-14

运行这段代码,我希望它增加测试变量5秒,然后完成。

import java.util.Timer;
import java.util.TimerTask;

public class Test {
    private static boolean running;

    public static void main( String[] args ) {
        long time = 5 * 1000;       // converts time to milliseconds
        long test = Long.MIN_VALUE;
        running = true;

        // Uses an anonymous class to set the running variable to false
        Timer timer = new Timer(); 
        timer.schedule( new TimerTask() { 
            @Override
            public void run() { running = false; }
        }, time );

        while( running ) {
            test++;
        }

        timer.cancel();
        System.out.println( test );
    }
}

然而,当我运行它时,程序并没有结束(我假设,我已经给了它合理的时间)。然而,如果我将while循环改为

    while( running ) {
        System.out.println();
        test++;
    }

程序在预期的时间内完成(并打印出许多行)。我不明白。为什么会出现这种现象?

共有1个答案

农鸿德
2023-03-14

根据Java内存模型,不能保证非易失性字段何时从另一个线程可见。在你的例子中,你的主要方法是JIT编译的,JIT编译器合理地假设当前线程不会修改循环中运行的变量,那么我们不应该在每次迭代中读取它并将循环转换为无限循环。甚至有关于这种情况的FindBugs警告。

添加System.out时。println调用,似乎JIT编译器无法内联它,因此无法确保此方法不会修改运行的variable,因此它会关闭字段读取优化。然而,这不应被视为问题的解决方案:即使您有System.out,较新版本的Java也可能更智能,并优化您的循环。println内。

 类似资料:
  • 我有一个包含以下内容的Java8流循环:

  • 编辑:修正了缺少的“)”,对不起,这不是问题。是的,我在模式中使用了一个不区分大小写的标志。下面是一些更多的代码: Edit2:stribizhev在下面指出的问题是,我在中读取的字符串实际上是整个ASCII文件。

  • 问题内容: 我有一个Java 8流循环,其内容如下: 满足某些条件时如何跳出循环?什么是关闭流的正确方法呢? 更新 我滥用流技术,假设它是一个循环,不是为此而设计的。这是我使用下面提供的答案最终得到的代码: 问题答案: 不是循环,也并非设计为使用终止。如果流是并行流,则lambda主体可以同时在不同的线程上执行(这不容易打破,并且很容易产生错误的结果)。 最好使用带有while循环的迭代器:

  • 获取“未终止字符类”错误。 如何修复? 短暂性脑缺血发作 这是我点击运行按钮时的屏幕打印(请注意错误信息):

  • 在我的程序中,我发现当为时,循环无法正确退出。它看起来像整数溢出,远远大于10,循环不会停止。请告诉我发生了什么,以及如何在大型项目中避免这个错误。 代码链接

  • 我找不到我的谜题。当我加载页面时,chrome会说:localhost页面不工作,localhost重定向了你太多次。我猜这是在创造一个循环。我可能做错了一些我无法得到的事情。这是我的密码。 授权控制器 模型 Authenticate.php config/auth.php