刚刚开始学习多线程机制,很多地方不了解.
程序中有类似如下代码:
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()方法中停止原先的线程,并且将原先的线程对象释放呢?

解决方案 »

  1.   

    线程一般启动,就不要去控制它停止,一种比较好的方式是:让线程完成自己的任务!按照你的需求,你可以创建一个线程池来实现,可以使用jdk1.5中的java。util。concurrent。
      

  2.   

    而且关键我想知道线程对象怎样能被及时释放?
    我用这样的方法:
    threadA=null;
    threadA=new Thread(this);
    以为threadA原来指向的线程对象就成为无用对象了,可是在执行内存分析器时发现,这时即使强制执行了垃圾回收,存活的线程数量并不减少, 说明似乎线程不像一般对象那样,置空就可以被回收了. 那么该怎么做呢?
      

  3.   

    线程没有重起这个概念,只有被挂起,如果线程被abort那么所有的中间变量都被清除,无法重新启动.新new一个,可以实现你的要求!
      

  4.   

    我有个重启线程的程序
    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类似简单示意就是这样