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循環外面的代碼");
}


}

執行結果如下:

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字句中做很多事情,比如保存數據,發出警告,通知用戶等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章