線程的屬性(優先級、守護線程、未捕獲異常處理器)

       一、線程優先級:每條線程都有一個優先級,默認狀況下,主線程的優先級是5(NOR_PRIORITY),子線程繼承它父線程的優先級。能夠用setPriority方法給一條線程設置優先級(MIN_PRIORITY=1,MAX_PRIORITY=10)。
       每當線程調度器有機會選擇新線程時,它首先會選擇具備較高優先級的線程。可是,線程優先級是高度依賴於系統的。當虛擬機依賴於宿主機平臺的線程實現機制時,Java線程的優先級被映射到宿主機平臺的優先級上,這種映射在常見的操做系統上都不能很好地實現。好比Windows有7個優先級,有幾個Java優先級將映射到相同的操做系統優先級。又好比在Sun公司爲Linux提供的Java虛擬機裏,全部的線程都有相同的優先級(優先級被忽略)。還有,Android中線程優先級是從-20到19.
    構建程序時,不要將功能的正確性依賴於優先級。若是確實要使用優先級,應該避免初學者常犯的一個錯誤:若是有幾個高優先級的線程沒有進入非活動狀態,低優先級的線程可能永遠也不能執行。 數據庫

       二、守護線程:能夠調用t.setDaemon(true)將線程轉換爲守護線程。守護線程的惟一做用是爲其它線程提供服務。好比計時線程。當只剩下守護線程時,虛擬機就退出了。
    使用守護線程是應該考慮的一個問題:守護線程應該永遠不去訪問固有資源,好比文件、數據庫等,由於它會在任什麼時候候甚至在一個操做的中間發生中斷。 spa

        3.未捕獲異常處理器:線程的run方法不能拋出任何被檢測的(checked)異常,可是,不被檢測的(unchecked)異常會致使線程終止。在這種狀況下,線程就會死亡。
        可是,不須要任何catch子句來處理能夠被傳播的異常。在線程死亡以前,異常被傳遞到一個用於未捕獲異常的處理器。
        該處理器必須屬於一個實現了Thread.UncaughtExceptionHandler接口的類。能夠用setUncaughtExceptionHandler方法爲任何線程安裝一個處理器。也能夠用Thread類的靜態方法setDefaultUncaughtExceptionHandler爲全部線程安裝一個默認的處理器。替換處理器的好處就是能夠使用日誌API發送未捕獲的異常的報告到文件。
        若是不安裝默認的處理器,默認的處理器就爲空。可是,若是不爲獨立的線程安裝處理器,此時的處理器就是該線程的ThreadGroup(它實現了UncaughtExceptionHandler接口)。
        ThreadGroup類實現了Thread.UncaughtExceptionHandler接口,它的uncaughtException方法作以下操做:
        1)若是該線程組有父線程組,那麼父線程組的uncaughtException方法被調用。
        2)不然,若是Thread.getDefaultExceptionHandler方法返回一個非空的處理器,則調用該處理器。
        3)不然,若是Throwable是ThreadDeath的一個實例(ThreadDeath對象由stop方法產生,而該方法已過期),什麼都不作。
        4)不然,線程的名字以及Throwable的棧蹤影被輸出到System.err上。 操作系統

相關文章
相關標籤/搜索