
如上圖所示,執行緒有四個屬性:
- 執行緒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#rd
個人微信:CaiBaoDeCai
微信公眾號名稱:Java知者
微信公眾號 ID: JavaZhiZhe
謝謝關注!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/554217.html
標籤:其他
上一篇:【python基礎】復雜資料型別-串列型別(排序/長度/遍歷)
下一篇:返回列表
