一、線程的各個屬性
- 線程編號(ID):
每個線程都有自己的ID,用戶標識不同的線程。JVM就是通過這個ID來找到某個線程。 - 線程名稱(Name):
可以讓用戶或開發者更容易定位問題。 - 是否是守護線程(isDaemon):
true代表這個線程是守護線;false代表這個線程是非守護線程,也就是用戶線程。 - 優先級(Priority):
該屬性目的是告訴線程調度器,用戶希望哪些線程能多運行,哪些線程能少運行。
二、線程ID
1.演示
/**
* 線程ID:
* 線程ID是從1開始自增的,但是JVM運行後,我們創建的線程的ID早已大於2
*/
public class ThreadPropers {
public static void main(String[] args) {
System.out.println("主線程的線程ID:"+Thread.currentThread().getId());
Thread thread = new Thread();
System.out.println("我們自己創建的線程的ID:"+thread.getId());
}
}
因爲JVM在後面創建了其他線程。
三、線程名字
1.線程默認的名字的源碼實現
默認即 ‘Thread-’ + ID。
2.修改線程的源碼
需要注意的是:
- 線程有一個java層的名字,也就是Thread的name屬性,這個屬性在任何時候都能修改。
- 但是一旦線程啓動了,也就是threadStatus!=0了,線程的native層的名字就不能修改了。
四、守護線程
1.用戶線程和守護線程
守護線程不能阻止JVM的關閉,當JVM發現所有的線程都是守護線程了,就直接和守護線程關閉了。
2.作用
給用戶線程提供服務,比如垃圾處理器。
3.守護線程的3個特性
- 守護線程的類型默認繼承自父線程。
我們使用new Thread()創建的線程是一個用戶線程,這是因爲我們的主線程就是一個用戶線程,new Thread()創建出的子線程會繼承父線程的類型。同樣,守護線程創建出的線程,也是守護線程。要用戶線程創建守護線程,需要手動修改線程的屬性,但是不應該這樣做。 - 通常而言,所有的守護線程都是由JVM自動啓動的,而不是由用戶線程啓動的。
- 不影響JVM的退出,當JVM要退出時,只關注用戶線程是否結束。
4.守護線程和用戶線程的區別
- 整體上無區別
- 唯一的區別在於是否影響JVM的區別
五、線程的優先級
1.簡介
JAVA的線程優先級有10個級別,默認是5,因爲主線程的優先級默認是5,所以創建的子線程也自動繼承父線程5。
2.代碼的設計不應該依賴於優先級
- 不同的操作系統不一樣
- 優先級會被操作系統改變
例如windows中的優先級推進器,它發現某個線程一直想執行,則會越過優先級設定,優先給它分配時間。這樣之前依賴優先級的邏輯就會被打破。
六、常見的面試問題
1.什麼時候我們需要設置守護線程?
通常情況下我們不需要設置守護線程,JVM提供的守護線程足夠我們使用。
2.如何使用優先級來幫助程序的運行?
我們不應該使用優先級來設定程序的運行,因爲不同的操作系統不一樣。
3.不同的操作系統如何處理優先級問題?
不同的操作系統有不同的優先級等級,例如windows系統中優先級的等級是7級,JVM會將JAVA中的10級映射到windows中的7級上。但是操作系統也有可能忽略優先級的設定。