線程組ThreadGroup分析詳解 多線程中篇(三)
阿新 • • 發佈:2019-02-11
borde 會有 能夠 執行 第一個 線程 守護 daemon wid 線程組,顧名思義,就是線程的組,邏輯類似項目組,用於管理項目成員,線程組就是用來管理線程。
每個線程都會有一個線程組,如果沒有設置將會有些默認的初始化設置
而在java中線程組則是使用類ThreadGroup 進行抽象描述
既然線程組是用來管理線程的,自然更多的是一種管理維度的抽象,所以很多方法也都是這個理念
不同於線程,對於線程組來說,他是有記錄自己的父線程組的,通過parent
另外,線程組也記錄了自己下面有哪些線程組,使用數組記錄,也就是構造方法中的 parent.add(this)
所以一個線程組核心的信息是:名稱、優先級、是否守護、父線程組、子線程組
另外還有一個默認的構造方法,看註釋,用來創建系統線程組
,是一個天花板,不是一個記錄尺
而在start方法中,又將當前線程添加到了線程組,請看下面的源碼截圖
在回頭看下這個add方法,借助於內部的線程數組,其實就是將這個線程添加到數組內
構造方法
想要了解一個類的具體信息,第一個要看的就是構造方法,看一下最多的內容的那個構造方法就可以大致了解到有哪些屬性了 ThreadGroup有兩個構造方法 仔細看下這兩個構造方法,其實只有一個了,那就是底層的私有的這一個 對於一個線程組來說,他擁有他自己的名字,也擁有他的優先級,也有是否是守護的說法名稱
線程組的名稱借助於內部的name屬性持有 通過構造方法可以設置名稱 提供了get方法用於獲取名稱優先級
此處的優先級,表示的是最大允許優先級,線程組內最大就允許這麽大 裏面所有的線程不能繼續變大,不要認為是記錄了裏面所有的線程中最大的那個值daemon
父線程組
對於線程組來說,是明確的記錄了他的父 借助於parent這個屬性值,可以獲取一個線程組的父線程組,也可以用來確定是否是一個指定線程組的父或者祖先子線程組
內部借助於ThreadGroup 數組維護內部的線程組,從這個數據組織結構來看,就很顯然,線程組內可以有線程組,可以層層嵌套形成樹狀結構的 對於線程組的創建,他必然會有一個父線程組(不設置就是當前線程所在的線程組了,也可以簡單說當前線程組) 創建線程組的時候,就會借助於add方法,將這個線程組加入到父線程組維護的數組內 對於任何一個線程,也都是擁有一個線程組,如果沒有設置,將會將當前線程的線程組作為線程組,這個在前面已經說過- nThreads 記錄的就是線程組內部的線程個數
- nUnstartedThreads記錄的是未啟動的個數
- 每個線程組也都知道自己包含多少個線程,哪些線程;
- 每個線程組也都知道自己包含了多少個線程組,哪些線程組;
子線程組相關方法
既然是樹形結構,那麽自然可能有枚舉節點的需求 ThreadGroup中提供了兩類enumerate方法,看名字應該就可以理解含義了,用於枚舉線程和線程組線程枚舉
底層依賴於私有枚舉方法,把此線程組及其子組中的所有活動線程復制到指定數組中。可以設置是否遞歸枚舉 兩個方法中,如果不指定是否遞歸,那麽默認是遞歸的,他們都將參數數組的第一個元素開始寫入(0號下標) 很顯然,他們內部就是借助於樹結構的變量,nThreads和thread[]數組 需要註意的是,如果數組內空間不足,多余的線程將不能夠保存進去,而且保存的是alive狀態的activeCount
該線程組以及子線程組中,活動線程的估計數。註意是一個估計數,估計數,估計數activeGroupCount
類似activeCount,這個方法是返回的線程組的個數,仍舊是估計數,估計數,估計數list方法
list看註釋,用於調試,底層依賴方法list(PrintStream out, int indent),indent表示的是縮進,也就是空格個數 仍舊是借助於nthreads和ngroups以及threads數組和group數組,也就是樹形結構循環遍歷打印信息interrupt()方法
中斷此線程組中的所有線程,可以看得出來: 仍舊是遍歷樹形結構,核心是調用所有線程的interrupt方法 所以,此方法是中斷該線程組以及所有子線程組中的所有線程線程組的銷毀
線程組的銷毀內部借助於boolean變量 destroyed 進行標識 getter方法,isDestroyed直接返回此字段 而setter方法destroy,也是設置這個字段,但是還有一些邏輯判斷與處理 destroy()負責銷毀此線程組及其所有子組。- 會進行權限校驗
- 並且此線程組必須為空,也就是nthreads > 0不成立,也就是此線程組中的所有線程都已停止執行。
- 並且會將子線程組中的也進行銷毀,是遞歸進行的,顯然,如果子線程組中線程非空,那麽仍舊會拋出異常
權限校驗checkAccess
checkAccess就是總提到的一個借助於安全管理器進行權限校驗的封裝 確定當前運行的線程是否有權修改此線程組異常處理器
uncaughtException,是用於異常處理的設置,此處不講,後續單獨章節。總結
從前面的描述可以看得出來,線程組就是對線程進行管理的一個抽象構建,他包括了自身的一些信息,還有一大部分就是對於線程的管理 線程組中有線程,也有線程組,借助於兩個變量和兩個數組完成了樹形結構的構造,很多方法都是借助於這個樹形結構完成的,比如枚舉 想要理解線程組,就要理解線程組“管理”角色的內涵,並且對線程組的樹形結構了解 既然是管理線程,所以線程中的一些功能或者屬性也是依賴線程組的,比如優先級,線程不能超過線程組的最大優先級,再比如Thread中的activeCount(),實際上就是currentThread().getThreadGroup().activeCount(); 總之,一定要理解管理二字的含義 原文地址:線程組ThreadGroup分析詳解 多線程中篇(三)線程組ThreadGroup分析詳解 多線程中篇(三)