Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java while循环在没有println的情况下不退出_Java_Loops_While Loop_Swingworker - Fatal编程技术网

Java while循环在没有println的情况下不退出

Java while循环在没有println的情况下不退出,java,loops,while-loop,swingworker,Java,Loops,While Loop,Swingworker,我目前正在Java Swingworker中运行一个单独的任务,下面是为清晰起见编辑的代码: while (true) { while (value == 0) { value = utils.getValue(); System.out.println("Value is zero"); } System.out.println("Value isn't zero, out of loop"); } 这段代码运行得非常好。但是,如果移除

我目前正在Java Swingworker中运行一个单独的任务,下面是为清晰起见编辑的代码:

while (true) {
    while (value == 0) {
        value = utils.getValue();
        System.out.println("Value is zero");
    }
    System.out.println("Value isn't zero, out of loop");
}
这段代码运行得非常好。但是,如果移除printlnValue为零,则不会发生任何事情,并且循环永远不会退出。另一个线程正在处理该值的填充,该值在程序启动大约5秒后更新


我有点困惑,为什么代码只有在有println的情况下才会执行。有人能解释一下吗?

我的最佳猜测是:添加一些睡眠条件,让其他线程有时间填充结果。 在你的问题中,你说大约需要5秒钟;如果在为true时添加忙等待循环,则这可能需要更长的时间

尝试:

长答案,读。 简而言之,一个线程在堆中存储的值可能已被其他线程缓存,如果您不同步它们,结果可能会令人惊讶。可能很难知道发生了什么以及为什么。通过同步访问共享变量,或在对象或变量中存储共享值。
你从不休息;我们无法回答这个问题,因为我们不知道getValue的作用。如果值始终为0,则不会看到任何输出,但它仍在运行。getValue只返回存储在另一个对象中的值。开始时该值为零,经过大约5秒的处理后,该值被更新。与println无关@ᴍ阿伦ᴍaroun我想他指的是内部循环,但什么也没有发生,他说外部循环没有打印出来,这就解决了!似乎这与不同的线程有关。谢谢你的解决方案!您还可以使用Thread.yield使忙等待循环更忙,但工作正常;谢谢LostBoy。我会试试的。使用睡眠来修复线程问题是一个可怕的黑客行为。当然是。但是考虑到目前使用的是while循环,这个解决方案是合适的。重写完整的代码以使用事件或等待其他线程当然会更好,但这似乎有点脱离上下文……非常感谢!我想我需要更加小心我的线程。
while (true) {
    while (value == 0) {
        value = utils.getValue();
        try {
            Thread.sleep(500);
        }
        catch (InterruptedException e) {
        }
        System.out.println("Value is zero");
    }
    System.out.println("Value isn't zero, out of loop");
}