如上圖所示,線程有四個屬性:
- 線程ID
- 線程名稱
- 守護線程
- 線程優(yōu)先級
1. 線程ID
-
每個線程都有id,這個id不能修改
-
線程id會不停的自增,從1開始
-
main函數(shù)就是第一個線程,id=1
id 是操作系統(tǒng)用來識別各個線程的編號,具有唯一性,從下面 java 的源碼中看到,這個線程的Id初始值是0,但是每一次生成Id的時候都是先自增的(++threadSeqNumber),所以起始值實際是1。
測試代碼:
/******
* 線程Id從1開始,JVM運行起來后,自己創(chuàng)建的線程的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());
}
}
打印結(jié)果:
以上看到主線程的id為1,可以理解,那么為什么我們創(chuàng)建的子線程id就直接為12了???
我們打斷點調(diào)試發(fā)現(xiàn),在我們的子線程創(chuàng)建之前,JVM其實已經(jīng)為我們創(chuàng)建了許多線程
- Signal Dispatcher是把操作系統(tǒng)的信號發(fā)給我們適當?shù)某绦虻摹?/li>
- Reference Handler是和GC相關(guān)的引用線程。
- Finalizer是負責(zé)執(zhí)行Finalizer對象的方法。
2. 線程名字
(1) 默認線程名的源碼分析
- 有參構(gòu)造器,指定線程名
- 無參構(gòu)造器,默認為
Thread-
,后接 nextThreadNum ,這個數(shù)字為0開始,自增
(2) 手動設(shè)置線程名字 setName()
從上圖中 java 的源碼可以看到,this.name = name 是修改 java 層面的線程的名字,然后 setNativeName() 是native方法(C/C++層面給線程的名字做一個設(shè)置),但當線程啟動之后,這個C/C++層面的名字不能修改了;不過 Java 層面的線程名字還是可以修改的。為什么當線程起來之后C/C++層面不能修改,是因為他做了一個!=0(線程的狀態(tài))的判斷,為0時就是線程 new 出來后還沒有 start。
3. 守護線程
線程類型有兩種:守護線程、用戶線程
守護線程的作用: 給用戶線程提供服務(wù)。
用戶線程和守護線程分類的標準:這個線程是否會阻止 JVM 的退出。當還有用戶線程在執(zhí)行的時候JVM是不會停止的,如果當前只剩下了守護線程,那么守護線程會隨著JVM一起停止。
線程類型的特性:
- 線程類型默認繼承自父線程
- 通常而言,所有的守護線程都是由 JVM 啟動。在 JVM 啟動的時候有一個非守護線程,那就是main函數(shù)。
- 守護線程不影響 JVM退出,當 JVM 退出的時候,他只看有沒有用戶線程。
守護線程和用戶線程區(qū)別
- 整體上沒有區(qū)別(只是代碼的任務(wù)不一樣)
- 唯一區(qū)別在于是否影響 JVM 的退出(如果是用戶線程會影響JVM的退出,守護線程則不會)
4. 線程優(yōu)先級
Q:線程的優(yōu)先級是什么?
A:在操作系統(tǒng)中,線程可以劃分優(yōu)先級,線程優(yōu)先級越高,獲得 CPU 時間片的概率就越大,但線程優(yōu)先級的高低與線程的執(zhí)行順序并沒有必然聯(lián)系,優(yōu)先級低的線程也有可能比優(yōu)先級高的線程先執(zhí)行。
優(yōu)先級有10個級別,默認5,在Java源碼中有三個定義,最低,默認,最高的優(yōu)先級定義,如下圖。
線程雖然有優(yōu)先級這個設(shè)定,但是實際開發(fā)中盡量不要設(shè)置優(yōu)先級,即對程序的設(shè)計不應(yīng)該依賴于優(yōu)先級,主要原因如下:
-
不同的操作系統(tǒng)優(yōu)先級不同
-
window
中只有7個優(yōu)先級,java 程序運行在 windows 系統(tǒng)時,會進行優(yōu)先級映射時,就可能會有多個優(yōu)先級映射成一個優(yōu)先級 -
linux
中所有線程優(yōu)先級會被忽略,所有線程優(yōu)先級一致
-
-
優(yōu)先級可能會被操作系統(tǒng)修改,即優(yōu)先級高的程序不一定被優(yōu)先執(zhí)行
5. 總結(jié)
文章來源:http://www.zghlxwxcb.cn/news/detail-469441.html
文章來源:https://mp.weixin.qq.com/s?__biz=MzU3NDgyMTIxMw==&mid=2247484552&idx=2&sn=9667c58b85d0cc52a30d27beec36087d&chksm=fd2dc2baca5a4bac168dccfd70d55e39db7203b0ef60a53e2e0ff9fd3f8bba7b9558e7d322f7#rd文章來源地址http://www.zghlxwxcb.cn/news/detail-469441.html
個人微信:CaiBaoDeCai
微信公眾號名稱:Java知者
微信公眾號 ID: JavaZhiZhe
謝謝關(guān)注!
到了這里,關(guān)于線程的四個屬性的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!