运行这段代码,我希望它增加测试变量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++;
}
程序在预期的时间内完成(并打印出许多行)。我不明白。为什么会出现这种现象?
根据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