这种关闭线程的方法是否安全或者有什么不足?
代码如下:
[code="java"]
package test;
public class Test extends Thread{
private boolean b = true;
/**
* 启动线程的方法
*/
synchronized public void run(){
System.out.println("线程启动");
while(b){
//做一些事
}
}
/**
* 关闭线程的方法
*/
public void close(){
b = false;
System.out.println("关闭线程");
}
}
[/code]
这种做法应该没什么问题,我在开源软件源码里也看到过。不过就是要注意一点,在b被设置为false的时候,run方法可能刚好进入while,这样在你close之后,还会多做一次//做一些事
如果没估计错误的话,这样线程永远停止不了。
线程的同步,在run方法里面是拷贝了一份b变量,你在程序的其他的部位设置b并未通知run方法去更新b变量的新值。
要正确运行的话 应该close方法也加上同步关键字。
而且Thread类停止并不需要你这么实现
Thread里面自带的线程终止标志 isinterrupted, public void run(){
while(!isinterrupted){}}
在server模式下确实是死循环,在client模式下,可能还能关掉。把变量加上volatile就不存在问题了!
这种方式我试了一下没法先什么问题,vm server模式下试了也没有什么问题。但是看一下Thread里面的interupt方法都是调用的本地方法,如果这样可以的话sun也不可能费劲去调用本地方法,所以还是不建议这么去实现。