在Java中有以下3种方法可以终止正在运行的线程:
1. 抛异常法;
2. 使用stop方法强行终止线程
3. 使用interrupt方法中断线程
下面分别对它们进行介绍:
一、抛异常法
抛异常法:顾名思义就是通过抛出一个异常,然后再捕获异常,从而跳过后面要继续执行的语句,达到终止线程的目的。使用抛异常法首先要判断该线程是否是停止状态,只有是停止状态才抛异常。
下面是具体示例:
package com.vhqimk.thread;
/*
* 测试通过抛异常终止线程的情况
*/
public class Test {
public static void main(String[] args) {
try {
MyThread myThread = new MyThread();
myThread.start();
myThread.sleep(2000);
myThread.interrupt();
} catch (InterruptedException e) {
System.out.println("main catch");
e.printStackTrace();
}
}
}
class MyThread extends Thread {
public void run() {
super.run();
try {
for (int i = 0; i < 500000; i++) {
if (this.interrupted()) {
System.out.println("已经是停止状态了!我要退出了!");
throw new InterruptedException();
}
System.out.println("i=" + (i + 1));
}
System.out.println("我在for下面");
} catch (InterruptedException e) {
System.out.println("进MyThread类run方法中的catch了!");
e.printStackTrace();
}
System.out.println("end!");
}
}
运行结果如图 1-7所示
图 1-7 运行结果
二、使用stop暴力停止
使用stop()方法停止线程则是非常暴力的,而且stop是作废过期的方法,因此不推荐使用这种方法。
下面是代码示例
package com.vhqimk.thread;
/*
* 测试stop方法终止线程的情况
*/
public class Test {
public static void main(String[] args) {
try {
MyThread myThread = new MyThread();
myThread.start();
myThread.sleep(8000);
myThread.stop();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class MyThread extends Thread {
private int i = 0;
public void run() {
super.run();
try {
while (true) {
i++;
System.out.println("i=" + i);
Thread.sleep(1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("end!");
}
}
运行结果如图 1-8所示
图 1-8 线程被暴力停止(stop)运行后图标呈灰色
三、使用interrupt方法中断线程
将方法interrupt()与return结合使用也能实现停止线程的效果,下面是具体示例:
package com.vhqimk.thread;
/*
* 测试interrupt方法终止线程的情况
*/
public class Test {
public static void main(String[] args) throws InterruptedException {
MyThread myThread = new MyThread();
myThread.start();
Thread.sleep(8000);
myThread.interrupt();
}
}
class MyThread extends Thread {
private int i = 0;
public void run() {
while (true) {
if (this.isInterrupted()) {
System.out.println("停止了!");
return;
}
System.out.println("timer=" + System.currentTimeMillis());
}
}
}
运行结果如图 1-9所示
图 1-9 成功停止运行
总结:停止线程有三种方法,建议使用“抛异常”法来实现线程的停止,因为在catch块中可以对异常信息进行相关的处理,而且使用异常流能更好、更方便地控制程序的运行流程,不会像第三种方法那样出现多个return,造成污染,也不建议用stop方法强行终止线程,因为使用它可能产生不可预料的结果。
(正在学习高洪岩先生著的《java多线程编程核心技术》,例子摘自此书,有兴趣的可以查阅此书)