Java线程不';不要在循环时停止,除非我在循环中打印一些内容

Java线程不';不要在循环时停止,除非我在循环中打印一些内容,java,while-loop,infinite-loop,Java,While Loop,Infinite Loop,我最近有一个小项目,我必须在while循环中做一些事情,while循环中有一个暂停,它将被线程停止 因为我的项目很大,我不能分享其他人可以测试和体验的东西。因此,我举了一个小例子 这是我在while循环中创建的暂停,然后线程出现并停止它 一旦我不在while循环中打印任何内容,while循环就是无限的。 一旦我在while循环中打印了一些东西,任何东西,while循环都是有限的 static boolean stallPipeline = false; public static void m

我最近有一个小项目,我必须在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);
}
static boolean stallPipeline=false;
公共静态void main(字符串[]args){
int i=0;
做{
while(管道){
//System.out.println(“”);
}
stallPipeline=true;
新线程(()->{
试一试{
睡眠(10);
}捕获(例外e){}
stallPipeline=false;
}).start();
}而(i++<2);
}
一旦取消对
System.out.println()的注释,循环将不再是无限的


有人能解释一下吗?

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

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

然而,共享变量上的忙循环几乎肯定不是一个线程等待另一个线程信号的方式。您希望使用一个锁,而不是用一个无意义的循环耗尽cpu


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

理论上,只要stallPipeline不是易失性的,并且没有同步代码,就不能保证一个线程对stallPipeline的更改对另一个线程是可见的。@YoavGur感谢您的解释。我将研究易失性变量和代码同步,以找出如何解决此问题。祝你有美好的一天!当你有时间的时候,这里有一个更深入解释的链接:@YoavGur我一定会查出来:DOh,Locks。我从没听说过。谢谢你的建议和解释。我现在明白了易变的东西和共享的变量;然而,我想指出的是,当我在循环中增加一个变量时,循环的行为并没有改变。@Nizar是的,这是意料之中的。尝试读取重复的目标。这很好地解释了这一点。总之,
System.out.println
是同步的,它具有与
volatile
变量类似的特性。增加一个变量是不同步的(尽管你可以把语句放在一个同步的块中)。好吧谢谢你的解释。祝你们俩度过愉快的一天。你只是让我的更容易。