注:本文主要參考《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循環外面的代碼");
}
}
執行結果如下:
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字句中做很多事情,比如保存數據,發出警告,通知用戶等。