我在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;
}
}
这是运用一个布尔型标记控制循环的停止
随手写的代码,希望对你有用。。。。