日期:2014-05-20  浏览次数:20732 次

怎样才能中止一个Thread对象并将其及时释放?
刚刚开始学习多线程机制,很多地方不了解.
程序中有类似如下代码:
class   A   implements   Runnable   {
    ...   ...
    private   Thread   threadA;

    public   A()   {
        ...   ...
        threadA=new   Thread(this);
    }

    public   void   run()   {
        ...   ...
    }
    public   void   start()   {threadA.start();}

    public   void   reset()   {
        ...   ...
        threadA=null;
        threadA=new   Thread(this);
    }
}
  程序中需要有一个reset()方法以使A对象能复原成初始的状态,使得当它再start()时能表现出与刚构造完再start()一样的行为.   我以为像上面那样,将threadA原先指向的线程对象置空再指向一个新线程对象就可以了,但调试时才发现这样做其实不能销毁原先的线程,它与新的线程同时存在并继续执行,造成了程序逻辑上的错误.
  那么怎样才能真正地在reset()方法中停止原先的线程,并且将原先的线程对象释放呢?

------解决方案--------------------
线程一般启动,就不要去控制它停止,一种比较好的方式是:让线程完成自己的任务!

按照你的需求,你可以创建一个线程池来实现,可以使用jdk1.5中的java。util。concurrent。
------解决方案--------------------
看门狗,停线程!
------解决方案--------------------
我有个重启线程的程序
MAIN启动多个线程时,把MAIN自身的引用传给线程,线程出错时TRY/CATCH捕捉到错误,调用MAIN的方法来重新启动一个新线程,老线程直接RETURN弹出

例:
master.java
public static void main(String[] args){
master ms = new master();
Thread th1 = new TH_1(ms);
Thread th2 = new TH_2(ms);

th1.start();
th2.start();
}
public void restartThread(String threadName){
if(threadName.equals( "thread1 ")
Thread th1 = new TH_1(this);
th1.start();
if(threadName.equals( "thread2 ")
Thread th2 = new TH_2(this);
th2.start();
}


TH_1.java
private master ms;
public TH_1(master ms){
this.ms = ms;
}
public void run(){
while(true){
try{
//todo
}catch(Exception ex){
//on error
ms.restartThread( "thread1 ");
return;
}
}
}

TH_2与TH_1类似

简单示意就是这样