1. 線程的狀态:
- new -> 建立完線程,但是還沒有啟動
- runnable -> 表示線程是活躍狀态
- terminated -> 表示線程已經結束了
線程在sleep的時候是什麼狀态?time-waited
2. stop 終止線程已經被淘汰
簡單來說是因為:使用stop方法雖然可以強行終止正在運作或挂起的線程,但使用stop方法是很危險的,就象突然關閉計算機電源,而不是按正常程式關機一樣,可能會産生不可預料的結果,是以,并不推薦使用stop方法來終止線程
3. 究竟如何停止線程?
- 任務中一般都會有循環結構,隻要用一個标記控制住循環,就可以結束任務。
- 如果線程處于了當機狀态,無法讀取标記,此時可以使用interrupt方法将線程從當機狀态強制恢複到運作狀态中來,讓線程具備CPU的執行資格
4. 以卡丁車為例(例子)
有兩個卡丁車準備通過同一條路,卡丁車1通過之後發送信号給卡丁車2,告訴卡丁車2可以通過:
卡丁一号在通過之後調用了carTwo.interrupt()方法,其實就是告訴卡丁二号,告訴卡丁二号可以出發了。卡丁二号就被标記了interrupted,可以被catch(InterruptedException)捕獲到,也就是說發現這個标記,就開始出發
在哪些情況下會抛出InterruptedException?
當線程正在等待、休眠或以其他方式被占用,并且線程在活動之前或期間被中斷時抛出。當線程處于Blocked、 waiting、timed_waiting狀态或者從這三種狀态轉換成runnable狀态的過程中如果被中斷,則會收到interruptedException。
如果線程沒有睡眠,調用它的interruptException會怎樣?
剛才一直在說,線程隻有在不活躍的情況下,被中斷,才會觸發interruptedException。那麼如果線程本就是在正常運作,被中斷會怎樣,,,,其實,觸發InterruptedException隻是中斷線上程非活躍狀态下的表現形式,中斷本身和線程是否在活躍狀态沒有關系,之是以在不活躍狀态下中斷會抛出異常,是因為線程在不活躍狀态下發生中斷的時候,如果不抛出異常的話,回不到正常狀态,回不到正常運作狀态就沒法進行中斷。即, 如果線程的狀态本來就是活躍的,這個時候觸發中斷線程會假裝看不見,繼續做他該做的事兒,活躍的線程就相當于把中斷無視掉了?這就需要看你的需求了,就是裝作假裝看不見繼續,還是處理一下。
怎樣知道自己是否被中斷,使用isinterrupted方法或者interrupted方法,就可以傳回是否被中斷的狀态。
前者檢視燈開了沒有,後者不僅檢視燈開了沒有,還要幫關上。
代碼:
public class TwoCarCrossBridge {
public static void main(String[] args) {
Thread carTwo = new Thread(() -> {
System.out.println("卡丁2号,準備過橋");
System.out.println("發現1号在過,開始等待");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
System.out.println("卡丁2号 開始過橋");
}
System.out.println("卡丁2号, 過橋完畢");
});
Thread carOne = new Thread(() -> {
System.out.println("卡丁1号 開始過橋");
int timeSpend = new Random().nextInt(500) + 1000;
System.out.println(timeSpend);
System.out.println("卡丁1号 過橋完畢 耗時:" + timeSpend);
carTwo.interrupt();
});
carOne.start();
carTwo.start();
}
}