1. 程式人生 > 其它 >java多執行緒梳理(1)

java多執行緒梳理(1)

要開始瞭解多執行緒的知識我們先得理解執行緒是什麼?執行緒和程序之間關係?

執行緒是什麼?

執行緒是程式的一個指令序列,具有傳統程序所具有的特徵,故又稱為輕型程序或程序元。執行緒一般包含於程序當中,一個程序可能有一個或多個執行緒。

執行緒和程序的區別?

程序是作業系統資源分配的基本單位,執行緒是處理器任務排程和執行的基本單元。

資源方面:每個程序都有獨立的程式碼和資料空間,程式間的切換會有較大開銷;執行緒因為是輕量級程序,每一個執行緒都有自己執行棧和程式計數器,切換開銷較小。

記憶體分配:統一程序的執行緒共享本程序的地址空間和資源,而程序之間的地址空間和資源是相互獨立的。

影響關係:一個程序崩潰後,在保護模式下不會對其他程序造成影響。但是一個執行緒崩潰往往會引起一整個程序都死掉。

執行過程:每個獨立的程序都有程式執行的入口,順序執行序列和程式出口。但是執行緒不能獨立執行,必須依靠應用程式,由其提供多個執行緒執行控制,兩者均可併發執行。

建立多執行緒的三種方式

1)繼承Thread類的方式建立多執行緒

編寫簡單,直接繼承即可,訪問當前執行緒只需要呼叫this指標。但是繼承Thread類無法再去繼承其他父類。

程式碼示例:

public class Test extends Thread{//繼承Thread類

  public void run(){//重寫run方法

  }

}

public class Main {

  public static void main(String[] args){

    new Test().start();//建立並啟動執行緒

  }

}

2)採用實現Runnable介面實現多執行緒


執行緒可以繼承其他父類或者其他介面,更為靈活。但是程式設計複雜,訪問當前程序,需要使用Thread.currentThread()方法。

程式碼示例:

public class Test2 implements Runnable {//實現Runnable介面

  public void run(){//重寫run方法

  }

}

public class Main {

  public static void main(String[] args){

    //建立並啟動執行緒

    Test myThread=new Test();

    Thread thread=new Thread(Test);

    thread().start();

    //或者 new Thread(new Test()).start();

  }

}

3)使用Callable介面建立多執行緒(不常用)


與Runnable相似,不過繼承的Callable會有一個功能更為強大的call()方法,可以有返回值,且能丟擲異常。我自己也沒用過。

執行緒的狀態

執行緒的生命週期及五種基本狀態

1)新建狀態(new):當執行緒物件建立後,就進入了新建狀態。如:Thread t =new Thread();

2)就緒狀態(Runnable):當呼叫執行緒物件的start()方法(t.start()),執行緒就進入就緒狀態。注意,執行緒進入就緒狀態只是說明執行緒做好了準備,等待cpu排程,不代表立馬執行。

3)執行狀態(Running):當cpu開始排程處於就緒狀態的執行緒時,此時執行緒進入執行狀態。就緒狀態是進入執行狀態的唯一入口,意思想進入執行狀態,首先必須處於就緒狀態中。

4)阻塞狀態:處於執行狀態中的執行緒由於某種原因,暫時放棄對cpu的使用權,停止執行,此時進入阻塞狀態,直到進入到就緒狀態,才有機會進入到執行狀態。分為三種:

1.等待阻塞:執行狀態中的執行緒執行wait()方法,使本執行緒進入到等待阻塞狀態;

2.同步阻塞:執行緒在獲取synchronize同步鎖失敗(因為鎖被其他執行緒佔用),它會進入同步阻塞狀態;

3.其他阻塞:通過呼叫執行緒的sleep()或join()或發出了io請求,執行緒會進入阻塞狀態。這種情況 當三種狀態結束後會自動轉入就緒狀態。

5)死亡狀態(Dead):執行緒執行完了或者因異常退出了run()方法,該執行緒結束生命週期。