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

在java里如何手动结束进程
在一个线程里执行一个长时间的任务,比如数据库操作,我想在设定的时间内如果还没有执行完,立刻中止该线程。
以下是我的测试代码,在指定的时间内并未结束线程,线程一直在运行着,请大家看看怎么实现这个功能,谢谢!

Java code

import javax.swing.Timer;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class InterruptedThread {

        /**
         * @param args
         */
        public static void main(String[] args) {
                final MyThread myTh = new MyThread();
                         
                  final Timer t = new Timer(200,new ActionListener(){
                      public void actionPerformed(ActionEvent e) {
                          System.out.println("1 actionPerformed:"  );
                          myTh.interrupt();
                         
                      }
                  });
                  t.setRepeats(false);

                  t.start();
                  myTh.start();


         }

}

class MyThread extends Thread {
        public void run() {
            for(int i=0;i<100000000;i++){
                System.out.println("MyThread run:" + i);
            }
            
         }
}


------解决方案--------------------
我把代码贴出来吧,共同讨论:

入口函数:
public class TestThread {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
FatherThread father = new FatherThread();
father.start();
}

}


父线程:
public class FatherThread extends Thread{
public void run(){
try{
System.out.println("开始监听此代码段,给两秒钟执行时间:");

ListenThread thread = new ListenThread(2*1000,this);//监听2秒
thread.start();
//写死循环进行测试
boolean flag = true;
while(flag){

}
//以下这句是不会打出来的,因为当前的线程被守护线程关闭了
System.out.println("监听完毕,未发现代码执行有问题,所以取消监听器");
thread.cancel(); 


}catch(Exception e){
e.printStackTrace();
}
}
}

守护线程:

public class ListenThread extends Thread{
private boolean isCanceled = false;
private FatherThread fatherThread = null;
/**
* 计时器超时时间
*/
private long timeout;
/**
* 构造器
* @param timeout 指定超时的时间
*/
public ListenThread(long timeout,FatherThread father) {
super();
this.fatherThread = father;
this.timeout = timeout;
//设置本线程为守护线程
this.setDaemon(true);
}
/**
* 取消计时
*/
public void cancel()
{
isCanceled = true;
}
/**
* 启动超时计时器
*/
public void run()
{
try {
//log.info("线程开始睡觉:"+timeout+"毫秒。");
System.out.println("父线程状态:"+this.fatherThread.isAlive()+"");
Thread.sleep(timeout);
if(!isCanceled){
//只要是在指定的timeout时间内,被监控的代码段没有执行完,则中止该线程
System.out.println("关闭父线程");
//System.out.println("父线程状态:"+this.fatherThread.isAlive()+"");
//if(this.fatherThread.isAlive()){
//System.out.println("父线程还活着,需要关闭");
this.fatherThread.stop();
//System.out.println("父线程状态:"+this.fatherThread.isAlive()+"");
//}
}else System.out.println("不需要关闭父线程");
} catch (Exception e) {
System.out.println("守护线程异常");
e.printStackTrace();
}
}


}

------解决方案--------------------
我理解,应该是个多线程的问题。
其中涉及到两个线程,一个是任务线程,一个是监控线程。
首先要明确各个线程的功能,内容。
1.任务线程要具备两个功能,一个功能是执行任务(就是LZ所说的长时间任务);另一个功能应该是终止正在进行的任务。
2.终止正在进行的任务,这个功能,一般是通过在代码中设置标志位来处理的。