当前位置: 代码迷 >> Java相关 >> 请问强制结束子线程的有关问题
  详细解决方案

请问强制结束子线程的有关问题

热度:57   发布时间:2016-04-22 20:55:18.0
请教强制结束子线程的问题
我在UI线程中启动了两个子线程,发现无法强制结束,故写了一个Java的Demo测试一下,测试代码如下,我用了Jion,Stop等无法强制结束线程。 请教强制结束子线程 问题。

package zmqClient;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;

import org.dom4j.DocumentHelper;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;



public class zmqClient {

/**
 * @param args
 */

public static void CloseThread()
{
;
}
public static int sPackID = 0;
private static  SendThread ComSendThread;
private static  RecvThread ComRecvThread;

public static void main(String[] args) throws InterruptedException, IOException {

ComSendThread = new SendThread();
ComRecvThread = new RecvThread();
ComSendThread.start();
ComRecvThread.start();

Thread.sleep(30*1000);

ComSendThread.join();
ComRecvThread.join();
while(!ComRecvThread.isInterrupted())
{
ComRecvThread.stop();
}

while(!ComSendThread.isInterrupted())
{
ComSendThread.stop();
}

ComSendThread.stop();
ComRecvThread.stop();

ComRecvThread.destroy();
ComSendThread.destroy();

while(true)
{
Thread.sleep(60*1000);
}

}


public static class  SendThread extends  Thread 
{  
    @Override
   public void  run() 
    {
     SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
     while(true)
     {
     System.out.printf (" %s\n",df.format(new Date())+":>>"+" I am ComSendThread");
     try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
     }
    }
    }

public static class RecvThread extends  Thread 
{  
    @Override
   public void  run() 
    {
     SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
     while(true)
     {
     System.out.printf (" %s\n",df.format(new Date())+":>>"+" I am ComRecvThread");
     try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
     }
    }
    }

}


------解决思路----------------------
强制结束子线程future.cancel()  ...子线程使用future模式,,,sleep的时候儿会抛出异常自动结束的.
------解决思路----------------------
可以把两个子线程改为守护线程,你试试,当主函数结束后,若子线程还在执行,会强制停止,
方法是  
 ComSendThread.setDaemon(true); //把ComSendThread线程当作守护进程   注意:必须在启动线程之前调用此方法
ComRecvThread.setDaemon(true);
------解决思路----------------------
线程的停止现在一般不推荐使用stop()方法,你可以用这个方法:
  public class st impiements Runnable{
private boolean isContinue=false;
      public void run(){
       while(true){
.....................//具体代码,自己写吧
if(isContinue){
break;
}
        }
    }
public void setContinue(){
this.isContinue=true;
}
}

这是运用一个布尔型标记控制循环的停止
随手写的代码,希望对你有用。。。。
  相关解决方案