Java之路:執行緒生命週期的控制
阿新 • • 發佈:2018-12-13
任何事物都有一個生命週期,執行緒也不例外。要想控制執行緒的生命,先得了解執行緒產生和消亡的整個過程。請讀者結合前面講的內容,請觀察下圖:
控制執行緒生命週期的方法有多種,如suspend()方法、resume()方法和stop()方法。但是這3個方法都不推薦使用,特別是suspend和resume方法儘量慎用,原因是它們很可能導致發生死鎖。
雖然stop()能夠避免死鎖的發生,但是也有其不足之處。如果一個執行緒正在操作共享資料段,操作過程沒有完成就 “stop()”了的話,將會導致資料的不完整,因此對stop()方法也不推薦使用。既然對這3個方法都不推薦使用,那麼到底該使用什麼方法控制執行緒的生命週期?請看下面的程式碼:
package com.xy.thread;
class ThreadDemo8 implements Runnable {
private boolean bFlag = true;
public void stopMe() {
bFlag = false;
}
public void run() {
while(bFlag) {
System.out.println(Thread.currentThread().getName() + "在執行!");
}
}
}
public class ThreadLife {
public static void main (String[] args) {
ThreadDemo8 t = new ThreadDemo8();
new Thread(t).start();
for(int i = 0; i < 10; i++) {
if(i == 5) {
t.stopMe();
}
System.out.println("mani執行緒正在執行!");
}
}
}
【結果】
本程式中定義了一個計數器 i ,用來控制main執行緒的迴圈列印次數。在i的值從0到4的這段時間內,這兩個執行緒是交替執行的,但當計數器i的取值變為5的時候,程式呼叫了TestThread類的stopMe()方法,而在stopMe()方法中,將布林變數bFlag賦值為false,也就是終止了while迴圈,run方法結束,Thread-0執行緒隨之結束。main執行緒在計數器i等於5的時候,呼叫TestThread類的stopMe方法後,CPU不一定會馬上切換到Thread-0執行緒上,也就是說Thread-0執行緒不一定會馬上終止,main執行緒的計數器i可能還會繼續累加,之後Thread-0執行緒才真正結束。
綜上所述,通過控制run方法中迴圈條件的方式來結束一個執行緒的方法是值得推薦使用的方法,這也是實際中用的最多的方法。