Java多線程:6.線程的4個屬性

一、線程的各個屬性

  • 線程編號(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級上。但是操作系統也有可能忽略優先級的設定。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章