class threadtest extend Thread{
//skip some code..
boolean runflag=true;
public synchronized void stopthread()
{
runflag=false;
}
public synchronized boolean getrunflag()
{
return runflag;
}
public void run() {
runflag=true;
try {
while (getrunflag()) {
//code1;
//code2;
//put your code here
}
}catch (IOException e) {
e.printStackTrace();
}
System.out.println(this.getClass().getName()+" stopped");
}
}
这样,每当需要停止该线程时,只需调用stopthread()即可。
这里有两点需要注意:
1)我们用了一个同步方法getrunflag()来得到当前的状态,为什么用这个方法而不是直接使用while(runflag)呢?
这个是因为在java的多线程模型中,有一个公共的对象存储区,但是每个对象都有自己的私有备份,当一个线程改变了状态,jvm并不能保证这个线程改变过的变量即时更新公共对象存储区的状态,可能(可能性不大)造成问题。
所以建议有好的设计习惯,采用同步方法来获得当前的runflag值。
2)还有一点,特别是涉及网络的多线程,如果发生了网络阻塞(在while循环里面发生),那么,即使runflag状态比如改变成false,由于程序被阻塞,线程用这种方法是永远都不会被停止的。
举个例子:比如上面的程序,如果code1是一段网络程式,如果在code1发生了阻塞,阻塞的意义就是得不到请求的资源,在无限期等待,这个时候,runflag状态的变化对while循环是起不了作用的,线程不会被停止。此时,可以使用thread.interrupt()来停止线程。