執行緒第三課——多執行緒初探與執行緒的生命週期
這節課我們來進入多執行緒,來初步感受下多執行緒,並瞭解下執行緒的宣告週期
Demo 01:
public static void main(String[] args) { //直接點,懶得想新的執行緒名了 Thread t1 = new Thread(new Runnable() { @Overridepublic 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,故而會交替輸出,這就是初步探索多執行緒。
注意:
執行狀態->等待狀態->就緒狀態的轉換是單向的,不可逆轉的
只有執行狀態和就緒狀態是可以相互轉換的
所以,等待狀態要進入執行狀態必須先進入就緒狀態(重點)