天天看點

java線程中斷 interrupt1.  線程的狀态:2.  stop 終止線程已經被淘汰3. 究竟如何停止線程?4.  以卡丁車為例(例子)

1.  線程的狀态:

  • new -> 建立完線程,但是還沒有啟動
  • runnable -> 表示線程是活躍狀态
  • terminated -> 表示線程已經結束了
線程在sleep的時候是什麼狀态?time-waited

2.  stop 終止線程已經被淘汰

簡單來說是因為:使用stop方法雖然可以強行終止正在運作或挂起的線程,但使用stop方法是很危險的,就象突然關閉計算機電源,而不是按正常程式關機一樣,可能會産生不可預料的結果,是以,并不推薦使用stop方法來終止線程

3. 究竟如何停止線程?

  1. 任務中一般都會有循環結構,隻要用一個标記控制住循環,就可以結束任務。
  2. 如果線程處于了當機狀态,無法讀取标記,此時可以使用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();
    }
}