如上圖所示,執行緒有四個屬性:
每個執行緒都有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其實已經為我們建立了許多執行緒
Thread-
,後接 nextThreadNum ,這個數位為0開始,自增從上圖中 java 的原始碼可以看到,this.name = name 是修改 java 層面的執行緒的名字,然後 setNativeName() 是native方法(C/C++層面給執行緒的名字做一個設定),但當執行緒啟動之後,這個C/C++層面的名字不能修改了;不過 Java 層面的執行緒名字還是可以修改的。為什麼當執行緒起來之後C/C++層面不能修改,是因為他做了一個!=0(執行緒的狀態)的判斷,為0時就是執行緒 new 出來後還沒有 start。
執行緒型別有兩種:守護執行緒、使用者執行緒
守護執行緒的作用: 給使用者執行緒提供服務。
使用者執行緒和守護執行緒分類的標準:這個執行緒是否會阻止 JVM 的退出。當還有使用者執行緒在執行的時候JVM是不會停止的,如果當前只剩下了守護執行緒,那麼守護執行緒會隨著JVM一起停止。
執行緒型別的特性:
守護執行緒和使用者執行緒區別
Q:執行緒的優先順序是什麼?
A:在作業系統中,執行緒可以劃分優先順序,執行緒優先順序越高,獲得 CPU 時間片的概率就越大,但執行緒優先順序的高低與執行緒的執行順序並沒有必然聯絡,優先順序低的執行緒也有可能比優先順序高的執行緒先執行。
優先順序有10個級別,預設5,在Java原始碼中有三個定義,最低,預設,最高的優先順序定義,如下圖。
執行緒雖然有優先順序這個設定,但是實際開發中儘量不要設定優先順序,即對程式的設計不應該依賴於優先順序,主要原因如下:
不同的作業系統優先順序不同
window
中只有7個優先順序,java 程式執行在 windows 系統時,會進行優先順序對映時,就可能會有多個優先順序對映成一個優先順序
linux
中所有執行緒優先順序會被忽略,所有執行緒優先順序一致
優先順序可能會被作業系統修改,即優先順序高的程式不一定被優先執行