java中,如何安全的结束一个正在运行的线程?【转载】
问题
Java中提供了很多调度线程的方法,上一节介绍了其中一种控制线程的方法:如何等待一个线程结束。那么如果不希望等待线程结束,而是根据问题的需要随时都要中断线程使其结束,这种对线程的控制方法该如何实现呢?
解决思路
首先必须先明确“中断”这个概念的实际含义,这里的中断是指一个线程在其任务完成之前被强行停止,提前消亡的过程。查阅JDK的帮助文档,可以找到这样一个和中断有关的方法:interrupt()。
它的语法格式如下所示:
public void interrupt()
该方法的功能是中断一个线程的执行。但是,在实际使用当中发现,这个方法不一定能够真地中断一个正在运行的线程。下面通过一个例子来看一看使用interrput()方法中断一个线程时所出现的结果。程序代码如下所示:
// 例4.4.3 InterruptThreadDemo3.java class MyThread extends Thread { volatile boolean stop = false; public void run() { while(!stop) { System.out.println(getName()+' is running'); try { sleep(1000); }catch(InterruptedException e){ System.out.println('week up from blcok...'); stop=true; // 在异常处理代码中修改共享变量的状态 } } System.out.println(getName()+' is exiting...'); } } class InterruptThreadDemo3 { public static void main(String[] args) throws InterruptedException { MyThread m1=new MyThread(); System.out.println('Starting thread...'); m1.start(); Thread.sleep(3000); System.out.println('Interrupt thread...:'+m1.getName()); m1.stop=true; // 设置共享变量为true m1.interrupt(); // 阻塞时退出阻塞状态 Thread.sleep(3000); // 主线程休眠3秒以便观察线程m1的中断情况 System.out.println('Stopping application...'); } }程序中如果线程m1发生了阻塞,那么虽然执行了m1.stop=true;语句,但是stop的值并未改变。为了能够中断该线程,必须在异常处理语句中对共享变量的值进行重新设置,从而实现了在任何情况下都能够中断线程的目的。
一定要记住,m1.interrupt();语句只有当线程发生阻塞时才有效。它的作用就是抛出一个InterruptedException类的异常对象,使try…catch语句捕获异常,并对其进行处理。请读者仔细研究这个程序,以便能够看出其中的巧妙之处。
【转载地址】
http://blog.tianya.cn/blogger/post_read.asp?BlogID=3668353&PostID=32699671