1. 程式人生 > >執行緒第三課——多執行緒初探與執行緒的生命週期

執行緒第三課——多執行緒初探與執行緒的生命週期

  這節課我們來進入多執行緒,來初步感受下多執行緒,並瞭解下執行緒的宣告週期

 

Demo 01:

public static void main(String[] args) {

    //直接點,懶得想新的執行緒名了



    Thread t1 = new Thread(new Runnable() {

        @Override

        
public void run() {             for (int i = 0; i < 10; i++) {                 System.out.println(Thread.currentThread().getName() + " " + i);            
}         }     });     t1.setName("執行緒1");     Thread t2 = new Thread(new Runnable() {         @Override         public void run() {            
for (int i = 0; i < 10; i++) {                 System.out.println(Thread.currentThread().getName() + " " + i);             }         }     });     t2.setName("執行緒2");     t1.start();     t2.start();     //各位猜猜執行結果會是怎樣 }

 

執行結果:

執行緒2 0

執行緒2 1

執行緒2 2

執行緒2 3

執行緒2 4

執行緒2 5

執行緒2 6

執行緒1 0

執行緒1 1

執行緒1 2

執行緒1 3

執行緒1 4

執行緒1 5

執行緒1 6

執行緒1 7

執行緒1 8

執行緒1 9

執行緒2 7

執行緒2 8

執行緒2 9

 

可以看到是交替輸出的(執行緒2輸出了一些,然後執行緒1又輸出一些,然後執行緒2又輸出一些,最重要的是,執行緒1是先啟動的,可卻先輸出執行緒2的內容)

 

可以看到是完全無規律的交替輸出

    為什麼會這樣呢?
    這就得說下執行緒的執行機制了。多個執行緒在啟動之後就開始搶佔CPU資源,哪個執行緒搶到了就執行那個執行緒裡的東西
    說到搶佔資源,接下來就要說說執行緒的生命週期(或者說是狀態),執行緒的狀態分為以下幾種:
    1. 新建狀態: 執行緒物件被建立完成,但還沒有執行start()方法啟動
    2. 執行狀態: 執行緒搶佔到CPU資源,並正在執行
    3. 等待狀態(阻塞狀態): 執行緒在執行過程中需要某項資源但遲遲無法獲得,就會進入等待狀態(最常見的就是等待輸入)
    4. 就緒狀態: 執行緒在啟動後會立刻進入就緒狀態,此時的執行緒已經準備一切需要使用資   源,但由於其他執行緒佔用著CPU故而只能在就緒佇列等待
    5. 停止狀態: 執行緒執行run()方法完畢或者程式直接結束或者呼叫stop()方法會導致執行緒進入停止狀態,此狀態下的執行緒釋放了佔有的資源
 

 

 

執行緒各狀態轉換圖

這樣也就不難理解為什麼執行緒和執行緒會交替輸出了,因為這二者是在搶佔CPU,執行緒1或執行緒2沒辦法保證自己能一直搶佔著CPU,故而會交替輸出,這就是初步探索多執行緒。

 

注意:

執行狀態->等待狀態->就緒狀態的轉換是單向的,不可逆轉的

只有執行狀態和就緒狀態是可以相互轉換的

所以,等待狀態要進入執行狀態必須先進入就緒狀態(重點)