Java while循环在没有println的情况下不退出
我目前正在Java Swingworker中运行一个单独的任务,下面是为清晰起见编辑的代码: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"); } 这段代码运行得非常好。但是,如果移除
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");
}