问题描述
这种关闭线程的方法是否安全或者有什么不足?代码如下: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("关闭线程");}}
解决方案
这种做法应该没什么问题,我在开源软件源码里也看到过。不过就是要注意一点,在b被设置为false的时候,run方法可能刚好进入while,这样在你close之后,还会多做一次//做一些事
解决方案二:
这种方式我试了一下没法先什么问题,vm server模式下试了也没有什么问题。但是看一下Thread里面的interupt方法都是调用的本地方法,如果这样可以的话sun也不可能费劲去调用本地方法,所以还是不建议这么去实现。
解决方案三:
在server模式下确实是死循环,在client模式下,可能还能关掉。把变量加上volatile就不存在问题了!
解决方案四:
如果没估计错误的话,这样线程永远停止不了。 线程的同步,在run方法里面是拷贝了一份b变量,你在程序的其他的部位设置b并未通知run方法去更新b变量的新值。要正确运行的话 应该close方法也加上同步关键字。 而且Thread类停止并不需要你这么实现 Thread里面自带的线程终止标志 isinterrupted, public void run(){while(!isinterrupted){}}
时间: 2024-12-30 20:23:37