java ThreadGroup 做用 方法解析(轉)

ThreadGroup線程組,java對這個類的描述呢就是
「線程組表示一組線程。此外,線程組還能夠包括其餘線程組。線程組造成一個樹,其中除了初始線程組以外的每一個線程組都有一個父線程組。
容許線程訪問關於其線程組的信息,但不容許訪問關於其線程組的父線程組或任何其餘線程組的信息。」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()

特殊的一個方法

public void uncaughtException(Thread t, Throwable e)

這個方法呢,做用很簡單 使 t 線程 拋出一個 Throwable e的異常。這個e 異常 也是你本身定義的。
若是前面設置了,測試

Thread.setDefaultUncaughtExceptionHandler((t, e) -> {
    System.out.println("默認的  "+t.getName());
    System.out.println("默認的  "+e);

});

那麼,在上面自定義的Throwable 會被這個捕獲,若是沒有設置,就打印標註錯誤流。對這個方法,存在的意義 比較困惑,,,this

 

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"));

 

運行結果
在這裏插入圖片描述spa

轉:https://blog.csdn.net/a1064072510/article/details/87455525.net

相關文章
相關標籤/搜索