執行緒的四個屬性

2023-06-03 15:00:43

如上圖所示,執行緒有四個屬性:

  • 執行緒ID
  • 執行緒名稱
  • 守護執行緒
  • 執行緒優先順序

1. 執行緒ID

  • 每個執行緒都有id,這個id不能修改

  • 執行緒id會不停的自增,從1開始

  • main函數就是第一個執行緒,id=1

id 是作業系統用來識別各個執行緒的編號,具有唯一性,從下面 java 的原始碼中看到,這個執行緒的Id初始值是0,但是每一次生成Id的時候都是先自增的(++threadSeqNumber),所以起始值實際是1。

測試程式碼:

/******
 * 執行緒Id從1開始,JVM執行起來後,自己建立的執行緒的Id早已不是0
 */
public class Id {
    public static void main(String[] args) {
        Thread thread = new Thread();
        System.out.println("主執行緒Id:"+Thread.currentThread().getId());
        System.out.println("子執行緒Id:"+thread.getId());
    }
}

列印結果:

以上看到主執行緒的id為1,可以理解,那麼為什麼我們建立的子執行緒id就直接為12了???

我們打斷點偵錯發現,在我們的子執行緒建立之前,JVM其實已經為我們建立了許多執行緒

  • Signal Dispatcher是把作業系統的訊號發給我們適當的程式的。
  • Reference Handler是和GC相關的參照執行緒。
  • Finalizer是負責執行Finalizer物件的方法。

2. 執行緒名字

(1) 預設執行緒名的原始碼分析

  • 有參構造器,指定執行緒名

  • 無參構造器,預設為Thread- ,後接 nextThreadNum ,這個數位為0開始,自增

(2) 手動設定執行緒名字 setName()

從上圖中 java 的原始碼可以看到,this.name = name 是修改 java 層面的執行緒的名字,然後 setNativeName() 是native方法(C/C++層面給執行緒的名字做一個設定),但當執行緒啟動之後,這個C/C++層面的名字不能修改了;不過 Java 層面的執行緒名字還是可以修改的。為什麼當執行緒起來之後C/C++層面不能修改,是因為他做了一個!=0(執行緒的狀態)的判斷,為0時就是執行緒 new 出來後還沒有 start。

3. 守護執行緒

執行緒型別有兩種:守護執行緒、使用者執行緒

守護執行緒的作用: 給使用者執行緒提供服務。

使用者執行緒和守護執行緒分類的標準:這個執行緒是否會阻止 JVM 的退出。當還有使用者執行緒在執行的時候JVM是不會停止的,如果當前只剩下了守護執行緒,那麼守護執行緒會隨著JVM一起停止。

執行緒型別的特性:

  • 執行緒型別預設繼承自父執行緒
  • 通常而言,所有的守護執行緒都是由 JVM 啟動。在 JVM 啟動的時候有一個非守護執行緒,那就是main函數。
  • 守護執行緒不影響 JVM退出,當 JVM 退出的時候,他只看有沒有使用者執行緒。

守護執行緒和使用者執行緒區別

  • 整體上沒有區別(只是程式碼的任務不一樣)
  • 唯一區別在於是否影響 JVM 的退出(如果是使用者執行緒會影響JVM的退出,守護執行緒則不會)

4. 執行緒優先順序

Q:執行緒的優先順序是什麼?

A:在作業系統中,執行緒可以劃分優先順序,執行緒優先順序越高,獲得 CPU 時間片的概率就越大,但執行緒優先順序的高低與執行緒的執行順序並沒有必然聯絡,優先順序低的執行緒也有可能比優先順序高的執行緒先執行。

優先順序有10個級別,預設5,在Java原始碼中有三個定義,最低,預設,最高的優先順序定義,如下圖。

執行緒雖然有優先順序這個設定,但是實際開發中儘量不要設定優先順序,即對程式的設計不應該依賴於優先順序,主要原因如下:

  • 不同的作業系統優先順序不同

    • window中只有7個優先順序,java 程式執行在 windows 系統時,會進行優先順序對映時,就可能會有多個優先順序對映成一個優先順序

    • linux中所有執行緒優先順序會被忽略,所有執行緒優先順序一致

  • 優先順序可能會被作業系統修改,即優先順序高的程式不一定被優先執行

5. 總結

文章來源:https://mp.weixin.qq.com/s?__biz=MzU3NDgyMTIxMw==&mid=2247484552&idx=2&sn=9667c58b85d0cc52a30d27beec36087d&chksm=fd2dc2baca5a4bac168dccfd70d55e39db7203b0ef60a53e2e0ff9fd3f8bba7b9558e7d322f7

個人微信:CaiBaoDeCai

微信公眾號名稱:Java知者

微信公眾號 ID: JavaZhiZhe

謝謝關注!