1. 程式人生 > 實用技巧 >執行緒的幾種建立方法

執行緒的幾種建立方法

建立執行緒的四種方式:

  1. 繼承Thread類,並複寫run方法,建立該類物件,呼叫start方法開啟執行緒。此方式沒有返回值。

    // 建立執行緒物件
    Thread t = new Thread() {
    public void run() {
    // 要執行的任務
    }
    };
    // 啟動執行緒
    t.start()
    
  2. 實現Runnable介面,複寫run方法,建立Thread類物件,將Runnable子類物件傳遞給Thread類物件。呼叫start方法開啟執行緒。此方法2較之方法1好,將執行緒物件和執行緒任務物件分離開。降低了耦合性,利於維護。此方式沒有返回值。

    Runnable runnable = new Runnable() {
    public void run(){
    // 要執行的任務
    }
    };
    // 建立執行緒物件
    Thread t = new Thread( runnable );
    // 啟動執行緒
    t.start();
    
  3. 建立FutureTask物件,建立Callable子類物件,複寫call(相當於run)方法,將其傳遞給FutureTask物件(相當於一個Runnable)。 建立Thread類物件,將FutureTask物件傳遞給Thread物件。呼叫start方法開啟執行緒。這種方式可以獲得執行緒執行完之後的返回值。該方法使用Runnable功能更加強大的一個子類.這個子類是具有返回值型別的任務方法。

    // 建立任務物件
    FutureTask<Integer> task3 = new FutureTask<>(() -> {
    log.debug("hello");
    return 100;
    });
    // 引數1 是任務物件; 引數2 是執行緒名字,推薦
    new Thread(task3, "t3").start();
    // 主執行緒阻塞,同步等待 task 執行完畢的結果
    Integer result = task3.get();
    log.debug("結果是:{}", result);
    
  4. 執行緒池

  • 提供了一個執行緒佇列,佇列中儲存著所有等待狀態的執行緒。避免了建立與銷燬額外開銷,提高了響應的速度。

常見的幾種狀態

【初始狀態】僅是在語言層面建立了執行緒物件,還未與作業系統執行緒關聯
【可執行狀態】(就緒狀態)指該執行緒已經被建立(與作業系統執行緒關聯),可以由 CPU 排程執行
【執行狀態】指獲取了 CPU 時間片執行中的狀態
當 CPU 時間片用完,會從【執行狀態】轉換至【可執行狀態】,會導致執行緒的上下文切換

【阻塞狀態】
如果呼叫了阻塞 API,如 BIO 讀寫檔案,這時該執行緒實際不會用到 CPU,會導致執行緒上下文切換,進入【阻塞狀態】
等 BIO 操作完畢,會由作業系統喚醒阻塞的執行緒,轉換至【可執行狀態】
與【可執行狀態】的區別是,對【阻塞狀態】的執行緒來說只要它們一直不喚醒,排程器就一直不會考慮排程它們
【終止狀態】表示執行緒已經執行完畢,生命週期已經結束,不會再轉換為其它狀態