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...'); } }