这个问题是关于改变变量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)
希望有人能帮忙解释一下这种现象吗?