在java里如何手动结束进程
在一个线程里执行一个长时间的任务,比如数据库操作,我想在设定的时间内如果还没有执行完,立刻中止该线程。
以下是我的测试代码,在指定的时间内并未结束线程,线程一直在运行着,请大家看看怎么实现这个功能,谢谢!
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); } }}
设置一个boolean型的变量作为标志位(线程运行是设置为true,结束时设置为false),找出任务的每个原子操作
(一般原子操作的时间会非常短,如果有长时间的原子操作或原子操作有阻塞操作,同时又不允许长时间等待关闭,则该方案不推荐使用),
在执行每个原子操作之前,先判断标志位,如果标志位为false则终止任务(当然,可以同时记录日志)。
3.监控线程,由于LZ的要求是要在某个时间点到达时,再判断并终止任务线程,所以,代码可以上来先sleep到时间点,
然后,在判断任务线程的标志位,如果为true,就设置成false,这样,任务线程,会自动终止。
其次要明确步骤。
1.任务线程在开始任务之前要设置标志位为true,同时创建监控线程(一般会将本身传递给监控线程的构造器)并运行监控线程。
2.任务线程开始执行任务,同时监控线程会进入sleep
3.当监控线程结束sleep后,会判断任务线程是否正在执行(判断标志位),如果为true就将其设置为false。
最后,补充一点,对标志位的更改操作,一般封装在任务线程的某个方法里面,让监控线程去调用。