# 多執行緒

有些迴圈的執行緒需要花較多的時間,此刻我們可以啟動另一個執行緒來執行。
多執行緒 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() 時就會進入此狀態。(進入此狀態就無法再次啟動)
更新於 閱讀次數

用實際行動犒賞爆肝的我😀

Zrn Ye LinePay

LinePay