1关键字与死循环
创建测试项目,创建PrintString.java类
public class PrintString {
private boolean isContinuePrint=true;
public boolean isContinuePrint(){
return isContinuePrint;
}
public void setContinuePrint(boolean isContinuePrint) {
this.isContinuePrint = isContinuePrint;
}
public void printStringMethod(){
try {
while(isContinuePrint)
{
System.out.println("run printStirngMethod threadName = "+Thread.currentThread().getName());
Thread.sleep(1000);
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
运行类run.java
public class Run {
public static void main(String[] args) {
PrintString printString = new PrintString();
printString.printStringMethod();
System.out.println("我要停止"+Thread.currentThread().getName());
printString.setContinuePrint(false);
}
}
运行结果:
又上面的结果可以看出来,我们明明调用了setContinuePrint(false) 却没有被执行,因为在main线程一直执行了while循环,导致下面的代码无法执行。解决这个问题的方法当然是用多线程技术。
解决同步死循环。修改PrintString代码:
public class PrintString implements Runnable{
private boolean isContinuePrint=true;
public boolean isContinuePrint(){
return isContinuePrint;
}
public void setContinuePrint(boolean isContinuePrint) {
this.isContinuePrint = isContinuePrint;
}
public void printStringMethod(){
try {
while(isContinuePrint)
{
System.out.println("run printStirngMethod threadName = "+Thread.currentThread().getName());
Thread.sleep(1000);
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void run() {
// TODO Auto-generated method stub
printStringMethod();
}
}
run代码:
public class Run {
public static void main(String[] args) {
PrintString printString = new PrintString();
new Thread(printString).start();
System.out.println("我要停止"+Thread.currentThread().getName());
printString.setContinuePrint(false);
}
}
运行结果:
但是上面代码运行在-server服务器模式中64bit的jvm上时,会出现死循环。解决的办法是用volatile;volatile的作用是强制从公共堆栈中取得变量的值,而不是从线程私有数据栈中取得变量的值。
未完待续。。。。。。