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

标签 java while-loop infinite-loop

<分区>

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

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

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

谁能解释一下?

最佳答案

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

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

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

在 Java 中,最简单的形式是创建一个锁对象并对其使用等待/通知。

关于除非我打印 Something Inside,否则 Java Thread 不会停止 While Loop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49845540/

相关文章:

c++ 无法清除 inputStream

php - 数组重复信息

在 Selenium WebDriver 中拖放的 JavaScript 解决方法

java - 自动组织 JUnit 测试

java - 如何使用hibernate更新主键字段

java - 在 Linux 终端中保持打印输出,直到它读取输入

c++ - atoi() 方法,char * cout

java - Rest 中 GET 请求的 URL 中只有空格会导致 404

java - 当用户在新行中按回车键时,他/她必须退出 while 循环。但它不起作用,它一直在换行

javascript - 鼠标移动后无限循环