当用volatile关键字声明变量的时候,就等于告诉虚拟机,这个变量极有可能被某些程序或者线程修改,为了保证比那辆被修改后应用程序范围内的所有线程可以看到这个改动,虚拟机必须采用一些方法保证这个变量的可见性。
public class PrintString {
private boolean isContinue = true;
public boolean isContinue() {
return isContinue;
}
public void setContinue(boolean aContinue) {
this.isContinue = aContinue;
}
public void printStringFunc(){
try {
while (isContinue){
System.out.println("run printStringFunc threadName=" + Thread.currentThread().getName());
Thread.sleep(1000);
}
}catch (InterruptedException e){
e.printStackTrace();
}
}
public static void main(String[] args){
PrintString printString = new PrintString();
printString.printStringFunc();
System.out.println("stop printStringFunc stopThread=" + Thread.currentThread().getName());
printString.setContinue(false);
}
}
run printStringFunc threadName=main
run printStringFunc threadName=main
run printStringFunc threadName=main
run printStringFunc threadName=main
run printStringFunc threadName=main
run printStringFunc threadName=main
run printStringFunc threadName=main
run printStringFunc threadName=main
...
上面的代码执行后会一直运行无法停下来,下面来看看解决方法。
public class PringStringThread { private boolean isContinue = true; public boolean isContinue() { return isContinue;
} public void setContinue(boolean aContinue) { this.isContinue = aContinue;
} public void printStringFunc(){ try { while (isContinue){
System.out.println("run printStringFunc threadName=" + Thread.currentThread().getName());
Thread.sleep(1000);
}
}catch (InterruptedException e){
e.printStackTrace();
}
}
}public static void main(String[] args){
PringStringThread pringStringThread = new PringStringThread(); new Thread(() -> pringStringThread.printStringFunc()).start(); try {
Thread.sleep(2000);
}catch (InterruptedException e){
e.printStackTrace();
}
pringStringThread.setContinue(false);
}
run printStringFunc threadName=Thread-0
run printStringFunc threadName=Thread-0
Process finished with exit code 0
可以发现线程退出循环了。
本节代码Github