閑來無事 寫篇部落格。
ThreadGroup線程組,java對這個類的描述呢就是
“線程組表示一組線程。此外,線程組還可以包括其他線程組。線程組形成一個樹,其中除了初始線程組之外的每個線程組都有一個父線程組。
允許線程通路關于其線程組的資訊,但不允許通路關于其線程組的父線程組或任何其他線程組的資訊。”
ThreadGroup并不是算是标注容器,因為,最後你會發現這個家夥是沒有public的 add,remove方法的。那怎麼把線程放到線程組裡面呢?
答案是 在new Thread(參數),将ThreadGroup當做參數傳進去。
Field
private final ThreadGroup parent;// 線程組的線程組,final 表名 線程組 不可以随便變更
String name; //名字
int maxPriority;//這個線程組 的元素 例如 線程 線程組的最大優先級,具體實作是 當線程或者線程組自身設定優先級的時候,總是取 自己父線程組的優先級和要設定的優先級的最小值
boolean destroyed;//判斷是否銷毀了
boolean daemon;//當守護程序線程組的最後一個線程停止或最後一個線程組被銷毀時,将自動銷毀該線程組。
int nUnstartedThreads = 0;
int nthreads;//這個線程組 裡面的線程數量
Thread threads[];//線程數組 ,持有 線程的引用
int ngroups;//這個線程組 裡面的線程組數量
ThreadGroup groups[];//線程組數組 ,持有 線程組的引用
私有構造方法
建立不在任何線程組中的空線程組。
此方法用于建立系統線程組。
private ThreadGroup()
公共構造方法
//建立一個新線程組。這個新組的父線程組是指定的線程組parent。線程組的 名字 就是name
會對 parent 調用checkAccess() 确定目前運作的線程是否具有修改此線程組的權限(比如 設定setDaemon)。有可能會抛出SecurityException異常
public ThreadGroup(ThreadGroup parent, String name)
//構造一個新線程組。這個新組的父線程組是目前運作線程的線程組。 就是調用上面的方法
public ThreadGroup(String name) {
this(Thread.currentThread().getThreadGroup(), name);
}
公共方法
public final String getName()//傳回線程組名字
//傳回父線程組 parent 調用checkAccess() 确定目前運作的線程是否具有修改此線程組的權限。
//有可能會抛出SecurityException異常
public final ThreadGroup getParent()
public final int getMaxPriority() //傳回線程組優先級
//測試此線程組是否是守護程序線程組。當守護程序線程組的最後一個線程停止或最後一個線程組被銷毀時,将自動銷毀該線程組。
public final boolean isDaemon()
public synchronized boolean isDestroyed()//測試該線程組是否已被銷毀。
public final void setDaemon(boolean daemon)//将線程組設定成守護線程組 ,會檢查 目前線程是否具有權限 修改線程組
//設定目前線程組以及子線程組的 優先級,取pri和目前線程組的父線程組的優先級的較小值為準。
//這個之是以會限制 Thread的最大優先級
//具體實作是 當線程或者線程組自身設定優先級的時候,總是取 自己父線程組的優先級和要設定的優先級的最小值
//會檢查 目前線程是否具有權限 修改線程組
public final void setMaxPriority(int pri)
//測試,目前這個線程組是否是 g線程組的父線程 或者參數
public final boolean parentOf(ThreadGroup g)
//檢查 目前線程是否具有權限 修改線程組 比如在目前線程中 用線程組自己本身調用它自己的一些方法 ,都會檢查
public final void checkAccess()
//傳回此線程組及其子線程組中活動線程數量的估計值。遞歸地周遊此線程組中的所有子組。 如果目前線程組已經destroyed,傳回0
public int activeCount()
//将線程組的中線程 活動線程放入list[]裡面 會自動擴大這個數組,如果{@code recurse}為{@code true},則此方法遞歸枚舉此線程組的所有子組,并引用這些子組中的每個活動線程
//注意這個聲明數組的方式
public int enumerate(Thread list[], boolean recurse)
//和上面方法類似 隻不過 下面這個 ThreadGroup
public int enumerate(ThreadGroup list[])
public int enumerate(ThreadGroup list[], boolean recurse)
//傳回此線程組及其子組中活動組的數量的估計值。遞歸地周遊此線程組中的所有子組。
public int activeGroupCount()
//interrupt此線程組中的所有線程。包括 子線程組中的線程
public final void interrupt()
特殊的一個方法
這個方法呢,作用很簡單 使 t 線程 抛出一個 Throwable e的異常。這個e 異常 也是你自己定義的。
如果前面設定了,
Thread.setDefaultUncaughtExceptionHandler((t, e) -> {
System.out.println("預設的 "+t.getName());
System.out.println("預設的 "+e);
});
那麼,在上面自定義的Throwable 會被這個捕獲,如果沒有設定,就列印标注錯誤流。對這個方法,存在的意義 比較困惑,,,
Thread.setDefaultUncaughtExceptionHandler((t, e) -> {
System.out.println("預設的 "+t.getName());
System.out.println("預設的 "+e);
});
ThreadGroup threadGroup = new ThreadGroup("father");
Thread two = new Thread(threadGroup,"two");
threadGroup.uncaughtException(two,new IllegalAccessException("ssss"));
運作結果