我最近有一个小项目,我不得不在一个while循环中做一些事情,并在while循环中有一个停止,它将被一个Thread停止。
由于我的项目很庞大,我无法分享其他人可以测试和体验的内容。因此,我就此做了一个小例子。
这是我在while循环中创建的停顿,然后线程出现并停止它。
一旦我不在while循环中打印任何内容,while循环就是无限的。 一旦我在while循环中打印了一些东西,while循环就是有限的。
static boolean stallPipeline = false;
public static void main (String[] args) {
int i = 0;
do {
while (stallPipeline) {
//System.out.println("");
}
stallPipeline = true;
new Thread(() -> {
try {
Thread.sleep(10);
} catch (Exception e) {}
stallPipeline = false;
}).start();
} while (i++ < 2);
}
取消注释System.out.println();
后,循环将不再是无限的。
任何人都可以解释一下吗?
答案 0 :(得分:2)
是的,它实际上并没有检查变量。 conpiler选择循环并将变量保存在寄存器中。在循环中放入一些内容会改变这种行为。
对于线程之间共享的任何变量,您可以尝试将变量标记为volotile。
然而,共享变量上的繁忙循环几乎肯定不是一个线程等待来自另一个线程的信号的方式。你想使用一个锁,而不是使用带有无意义循环的cpu。
在java中,最简单的形式是创建一个锁对象并对其使用wait / notify。