# 多執行緒
有些迴圈的執行緒需要花較多的時間,此刻我們可以啟動另一個執行緒來執行。
多執行緒 multi-thread
就是可以同時執行多個程式區塊。
# 基本用法
- 建立延伸自
Thread
類別的子類別 - 執行緒必須寫在
run()
函數中
Thread
就是執行緒的意思,他存放在 java.lang
類別庫當中,平時會自動載入。
而 run()
是 Thread
類別當中的一個函數。
| class 類別名稱 extends Thread{ |
| 資料成員,函數...; |
| run(){ |
| |
| } |
| } |
建立子類別的目的,是我們可以進行 override
改寫的動作,改寫來自 Thread
類別當中的 run()
函數。
# 使用範例
| class multi_Test extends Thread{ |
| private String name; |
| public CTest(String str){ |
| name=str; |
| } |
| public void run(){ |
| for(int i=0;i<3;i++){ |
| for(int j=0;j<100000000;j++); |
| System.out.println(name); |
| } |
| } |
| } |
main() | public class multi_thread{ |
| public static void main(String args[]){ |
| multi_Test apple=new multi_Test("apple"); |
| multi_Test pen=new multi_Test("pen"); |
| apple.start(); |
| pen.start(); |
| } |
| } |
如果直接呼叫 run()
,這樣並無法啟動執行緒,只是再將執行緒執行一遍而已,我們繼承了來自 Thread
類別,也會繼承當中的 start()
。而這個 start()
會在 scheduler
排程器中登入執行緒,當執行緒開始執行 run()
才被呼叫。
# 實作 Runnable 介面
若本身類別已經繼承了其他父類別,但又想繼承 Thread
類別,這時就會遇到 Java 無法多重繼承。
想到多重繼承就會想到 介面,在多重繼承中提到:透過 介面 就能達到多重繼承。使用的方式跟繼承 Thread
類似:
使用方式 | class 類別名稱 implements Runnable{ |
| 資料成員,函數...; |
| run(){ |
| |
| } |
| } |
使用範例 | class multi_Test implements Runnable{ |
| private String name; |
| public multi_Test(String str){ |
| name=str; |
| } |
| public void run(){ |
| for(int i=0;i<3;i++){ |
| for(int j=0;j<100000000;j++); |
| System.out.println(id+" is running.."); |
| } |
| } |
| } |
main() | public class multi_thread{ |
| public static void main(String args[]){ |
| multi_Test apple=new multi_Test("apple"); |
| multi_Test pen=new multi_Test("pen"); |
| Thread m1 = new Thread(apple); |
| Thread m2 = new Thread(pen); |
| m1.start(); |
| m2.start(); |
| } |
| } |
在 main()
中,除了建立物件,也要分別產生 Thread
類別物件,來呼叫 start()
啟動執行緒喔~~
# 生命週期
- 新產生的 newly created
使用 new Thread()
建立物件時,就會進入此狀態。(此時系統不會配置資源) - 可執行的 runable
當 start()
啟動執行緒,最先搶到資源的先執行 run()
;未搶到的將會在 queue 佇列中等待爭取。 - 執行中的 running
先搶到資源的執行緒就會進入這個狀態。(一次僅有一個執行緒會在此狀態) - 被凍結的 blocked
- 呼叫
wait()
- 呼叫
sleep()
- 與另一個執行緒
join()
一起時:當有其他執行緒呼叫 join()
,原來正執行的執行緒會先暫停
- 銷毀的 dead
當 run()
結束,或呼叫 stop()
時就會進入此狀態。(進入此狀態就無法再次啟動)