Java 除非我打印 Something Inside,否则线程不会停止 While Loop

Java Thread doesn't stop While Loop unless I print Something Inside

我最近有一个小项目,我必须在 while 循环中做一些事情,并且在 while 循环中有一个 stall,它将被线程停止。

由于我的项目很大,我不会分享一些其他人可以测试和体验的东西。因此,我做了一个小例子。

这是我在 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();,循环将不再是无限的。

谁能解释一下?

是的,它实际上并没有检查变量。 编译器优化循环并将变量保存在寄存器中。将一些内容放入循环中会改变这种行为。

对于线程之间共享的任何变量,您可以尝试将变量标记为可变变量。

但是,共享变量上的繁忙循环几乎绝对不是一个线程等待来自另一个线程的信号的方式。您想使用锁而不用无意义的循环用完 cpu。

在java中,最简单的形式是创建一个锁对象并在其上使用wait/notify。