Java多线程之停止一个线程

注:本文主要参考《Java多线程编程核心技术》高洪岩


方法一:利用MyThread.interrupt()与break


public class MyThread extends Thread{


@Override
public void run() {
for(int i=0; i<1e5; i++){
if(this.interrupted()){
System.out.println("MyThread interrupted");
break; //会直接跳到for循环外面,继续执行for循环外面的代码
}
System.out.println("i= "+i);
}
}


}



public class Main {
public static void main(String[] args) throws InterruptedException{
MyThread myThread=new MyThread();
myThread.start();
Thread.sleep(1000);
myThread.interrupt();
}

}


运行结果:
i=0
.......
i= 27195
i= 27196
i= 27197
i= 27198
MyThread interrupted//表明该线程被正确停止了。



方法二:利用MyThread.interrupt()与return
如果出现下面代码:
public class MyThread extends Thread{


@Override
public void run() {
for(int i=0; i<1e5; i++){
if(this.interrupted()){
System.out.println("MyThread interrupted");
break;
}
System.out.println("i= "+i);
}
//for循环外面还有代码,当收到中断线程的指令后,break跳出
//for循环,本线程继续执行for循环外面的代码;
System.out.println("执行for循环外面的代码");
}


}

执行结果:

i=0
.......

i= 26231
i= 26232
MyThread interrupted
执行for循环外面的代码



解决办法如下:
public class MyThread extends Thread{


@Override
public void run() {
for(int i=0; i<1e5; i++){
if(this.interrupted()){
System.out.println("MyThread interrupted");
return; //利用return直接终止run方法
}
System.out.println("i= "+i);
}
System.out.println("执行for循环外面的代码");
}


}

执行结果如下:
【Java多线程之停止一个线程】
i=0
.......

i= 37716
i= 37717
i= 37718
MyThread interrupted



方法三:利用throw new InterruptedException(),抛出异常的方法
public class MyThread extends Thread{


@Override
public void run() {
try {
for (int i = 0; i < 1e5; i++) {
if (this.interrupted()) {
System.out.println("MyThread interrupted");
throw new InterruptedException();
}
System.out.println("i= " + i);
}
System.out.println("执行for循环外面的代码");
} catch (InterruptedException e) {
System.out.println("has catched InterruptedException");
//e.printStackTrace();
}
}


}



执行结果如下:

i=0
.......

i= 37979
i= 37980
i= 37981
i= 37982
MyThread interrupted
has catched InterruptedException



注:据高洪岩老师所说,通过抛出异常来中断线程是最合适的办法,不过,上述三种方法都有自己的适用性,抛出异常的方法,适用性最广,我们也可以在catch字句中做很多事情,比如保存数据,发出警告,通知用户等。

    推荐阅读