什麼是java的守護線程

線程 是程序中的執行線程。Java 虛擬機允許應用程序併發地運行多個執行線程。

每個線程都有一個優先級,高優先級線程的執行優先於低優先級線程。每個線程都可以或不可以標記爲一個守護程序。當某個線程中運行的代碼創建一個新 Thread 對象時,該新線程的初始優先級被設定爲創建線程的優先級,並且當且僅當創建線程是守護線程時,新線程纔是守護程序。

當 Java 虛擬機啓動時,通常都會有單個非守護線程(它通常會調用某個指定類的 main 方法)。Java 虛擬機會繼續執行線程,直到下列任一情況出現時爲止:

  • 調用了 Runtime 類的 exit 方法,並且安全管理器允許退出操作發生。
  • 非守護線程的所有線程都已停止運行,無論是通過從對 run 方法的調用中返回,還是通過拋出一個傳播到 run 方法之外的異常。

在JAVA中守護線程就是調用了SETDAEMON()方法的線程,即後臺線程.

這個方法的調用要在START()方法之前(這是必須的:因爲一個線程創建的時候,默認的是前臺線程);

守護線程的功能:

             爲非後臺線程服務。(例如垃圾回收的精靈線程)

如果前臺線程全部結束,則後臺線程也隨即結束,然後JVM退出;否則後臺的守護線程將一直執行。

Java線程的管理
  
  
  線程的狀態控制
  
  在這裏需要明確的是:無論採用繼承Thread類還是實現Runnable接口來實現應用程序的多線程能力,都需要在該類中定義用於完成實際功能的run方法,這個run方法稱爲線程體(Thread Body)。按照線程體在計算機系統內存中的狀態不同,可以將線程分爲創建、就緒、運行、睡眠、掛起和死亡等類型。這些線程狀態類型下線程的特徵爲:
  
  創建狀態:當利用new關鍵字創建線程對象實例後,它僅僅作爲一個對象實例存在,JVM沒有爲其分配CPU時間片等線程運行資源;
  
  就緒狀態:在處於創建狀態的線程中調用start方法將線程的狀態轉換爲就緒狀態。這時,線程已經得到除CPU時間之外的其它系統資源,只等JVM的線程調度器按照線程的優先級對該線程進行調度,從而使該線程擁有能夠獲得CPU時間片的機會。
  
  睡眠狀態:在線程運行過程中可以調用sleep方法並在方法參數中指定線程的睡眠時間將線程狀態轉換爲睡眠狀態。這時,該線程在不釋放佔用資源的情況下停止運行指定的睡眠時間。時間到達後,線程重新由JVM線程調度器進行調度和管理。
  
  掛起狀態:可以通過調用suspend方法將線程的狀態轉換爲掛起狀態。這時,線程將釋放佔用的所有資源,由JVM調度轉入臨時存儲空間,直至應用程序調用resume方法恢復線程運行。
  
  死亡狀態:當線程體運行結束或者調用線程對象的stop方法後線程將終止運行,由JVM收回線程佔用的資源。
  
  在Java線程類中分別定義了相應的方法,用於在應用程序中對線程狀態進行控制和管理。
  
  線程的調度
  
  線程調用的意義在於JVM應對運行的多個線程進行系統級的協調,以避免多個線程爭用有限資源而導致應用系統死機或者崩潰。
  
  爲了線程對於操作系統和用戶的重要性區分開,Java定義了線程的優先級策略。Java將線程的優先級分爲10個等級,分別用1-10之間的數字表示。數字越大表明線程的級別越高。相應地,在Thread類中定義了表示線程最低、最高和普通優先級的成員變量MIN_PRIORITY、MAX_PRIORITY和NORMAL_PRIORITY,代表的優先級等級分別爲1、10和5。當一個線程對象被創建時,其默認的線程優先級是5。
  
  爲了控制線程的運行策略,Java定義了線程調度器來監控系統中處於就緒狀態的所有線程。線程調度器按照線程的優先級決定那個線程投入處理器運行。在多個線程處於就緒狀態的條件下,具有高優先級的線程會在低優先級線程之前得到執行。線程調度器同樣採用"搶佔式"策略來調度線程執行,即當前線程執行過程中有較高優先級的線程進入就緒狀態,則高優先級的線程立即被調度執行。具有相同優先級的所有線程採用輪轉的方式來共同分配CPU時間片。
  
  在應用程序中設置線程優先級的方法很簡單,在創建線程對象之後可以調用線程對象的setPriority方法改變該線程的運行優先級,同樣可以調用getPriority方法獲取當前線程的優先級。
  
  在Java中比較特殊的線程是被稱爲守護(Daemon)線程的低級別線程。這個線程具有最低的優先級,用於爲系統中的其它對象和線程提供服務。將一個用戶線程設置爲守護線程的方式是在線程對象創建之前調用線程對象的setDaemon方法。典型的守護線程例子是JVM中的系統資源自動回收線程,它始終在低級別的狀態中運行,用於實時監控和管理系統中的可回收資源。
  
  線程分組管理
  
  Java定義了在多線程運行系統中的線程組(ThreadGroup)對象,用於實現按照特定功能對線程進行集中式分組管理。用戶創建的每個線程均屬於某線程組,這個線程組可以在線程創建時指定,也可以不指定線程組以使該線程處於默認的線程組之中。但是,一旦線程加入某線程組,該線程就一直存在於該線程組中直至線程死亡,不能在中途改變線程所屬的線程組。
  
  當Java的Application應用程序運行時,JVM創建名稱爲main的線程組。除非單獨指定,在該應用程序中創建的線程均屬於main線程組。在main線程組中可以創建其它名稱的線程組並將其它線程加入到該線程組中,依此類推,構成線程和線程組之間的樹型管理和繼承關係。
  
  與線程類似,可以針對線程組對象進行線程組的調度、狀態管理以及優先級設置等。在對線程組進行管理過程中,加入到某線程組中的所有線程均被看作統一的對象。

 

發佈了34 篇原創文章 · 獲贊 8 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章