在java中有以下三种方式可以终止正在运行的线程:
- 使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。
- 使用stop方法强行终止线程,但是不推荐这个方法,因为stop和suspend以及resume一样,都是过期的方法,使用他么可能会产生不可预料的结果。
- 使用interrrut方法中断线程。
停止线程—异常法
新建Mythread类继承Thread
public class MyThread extends Thread{
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
//通过异常法来停止线程
try {
for(int i = 0;i<500000;i++)
{
System.out.println(i);
if(this.interrupted()){
System.out.println("已经停止了,我要退出");
throw new InterruptedException();
}
}
System.out.println("如果没停止成功,就会运行我");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
System.out.println("停止");
e.printStackTrace();
}
}
}
新建测试类
public class Test1 {
public static void main(String[] args) {
try {
MyThread myThread = new MyThread();
myThread.start();
myThread.sleep(1000);
myThread.interrupt();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
System.out.println("main catch");
e.printStackTrace();
}
System.out.println("finish");
}
}
运行结果如图所示:
2在沉睡中停止
如果线程在沉睡中被停止的话会发生什么呢?
同样新建MyThread
public class MyThread extends Thread{
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
//通过异常法来停止线程
try {
System.out.println("开始运行");
Thread.sleep(200000);
System.out.println("结束运行");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
System.out.println("在沉睡中被停止"+this.isInterrupted());
e.printStackTrace();
}
}
}
测试代码
public class Test1 {
public static void main(String[] args) {
try {
MyThread myThread = new MyThread();
myThread.start();
myThread.sleep(1000);
myThread.interrupt();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
System.out.println("main catch");
e.printStackTrace();
}
System.out.println("finish");
}
}
运行结果:
从打印的结果可以看出,如果在sleep状态下停止某一个线程,会进去catch语句,并清楚停止状体,使之变成false。
前一个实验是先sleep再用interrpt()停止,与之相反的操作也要注意。下面的是先Interrpt()再调用sleep的测试:
新建MyThread类继承Thread:
package thread;
public class MyThread extends Thread{
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
//通过异常法来停止线程
try {
for(int i =0;i<100000;i++){
System.out.println(i);
}
System.out.println("开始运行");
Thread.sleep(200000);
System.out.println("结束运行");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
System.out.println("先停止,再遇到sleep!进入catch");
e.printStackTrace();
}
}
}
测试类:
public class Test1 {
public static void main(String[] args) {
MyThread myThread = new MyThread();
myThread.start();
myThread.interrupt();
System.out.println("finish");
}
}
运行结果:
暴力停止线程
使用stop来停止线程是非常暴力的。
新建Mythread类:
package thread;
public class MyThread extends Thread{
private int i = 0;
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
//通过异常法来停止线程
try {
while(true){
i++;
System.out.println("i="+i);
Thread.sleep(1000);
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
新建测试类:
public class Test1 {
public static void main(String[] args) {
try {
MyThread myThread = new MyThread();
myThread.start();
Thread.sleep(8000);
myThread.stop();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
下面的测试:
运行结果:

方法stop()与java.lang.ThreadDeath异常
调用stop()方法会抛出java.lang.ThreadDeath异常,但在通常的情况下,该异常不需要显式的捕捉。
创建测试用的项目,文件MyThread的代码如下:
public class MyThread extends Thread {
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
// 通过异常法来停止线程
try {
this.stop();
} catch (ThreadDeath e) {
// TODO Auto-generated catch block
System.out.println("进入了catch方法");
e.printStackTrace();
}
}
}
测试方法:
public class Test1 {
public static void main(String[] args) {
MyThread myThread = new MyThread();
myThread.start();
}
}
运行结果:
使用return方法停止线程
将方法interrupt()与return 结合使用也能实现停止线程的效果。
创建线程测试用的项目,线程类MyThread代码如下:
public class MyThread extends Thread {
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
// 通过异常法来停止线程
while(true){
if(this.isInterrupted()){
System.out.println("停止了");
return;
}
System.out.println("timer"+System.currentTimeMillis());
}
}
}
运行的代码:
public class Test1 {
public static void main(String[] args) throws InterruptedException {
MyThread myThread = new MyThread();
myThread.start();
Thread.sleep(2000);
myThread.interrupt();;
}
}
运行结果:
可以看到其成功的停止了线程