刚刚开始学习多线程机制,很多地方不了解.
程序中有类似如下代码:
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()方法中停止原先的线程,并且将原先的线程对象释放呢?
程序中有类似如下代码:
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()方法中停止原先的线程,并且将原先的线程对象释放呢?
我用这样的方法:
threadA=null;
threadA=new Thread(this);
以为threadA原来指向的线程对象就成为无用对象了,可是在执行内存分析器时发现,这时即使强制执行了垃圾回收,存活的线程数量并不减少, 说明似乎线程不像一般对象那样,置空就可以被回收了. 那么该怎么做呢?
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类似简单示意就是这样