混淆java while while循环,希望有人能帮助我。

时间:2018-02-21 13:23:49

标签: java

这个问题是关于改变变量for while,但在其中无效。 代码如下:

public class StopThreadTest extends Thread {
private boolean isStop = false;

private void setStop() {
    isStop = true;
}

@Override
public void run() {
    while (!isStop) {
        try {
            Thread.sleep(1);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

public static void main(String[] args) throws InterruptedException {
    StopThreadTest test = new StopThreadTest();
    test.start();
    //
    Thread.sleep(2000);
    test.setStop();
    System.out.println(" has set stop ... ");
}}

当我运行此代码时,程序可以正常终止。但是当我在run方法中注释掉代码时(如下所示),程序无法终止itseslf。

@Override
public void run() {
    while (!isStop) {
        try {
            //when comment out the blow line ,the program will runs forever .
            //Thread.sleep(1);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

但是当我设置变量" isStop"挥发性,程序再次正常运行。

private volatile boolean isStop = false;

所以,我的问题是: 一个。如果不使用volatile,变量在while循环中不能再次读取?但是为什么在while循环中有一个操作(如打印一个字,或者睡1个磨),它可以正常工作?

我的环境是(windows 10,x64,jdk1.8)

希望有人能帮忙解释一下这种现象吗?

0 个答案:

没有答案