在主線程建立得線程,若是沒有給他指定線程組,那麼建立的線程,默認和主線程同一個線程組。線程組能夠底下能夠是線程,也能夠實線程組。數組
構建線程組的方法:this
private ThreadGroup()線程
public ThreadGroup(String name)code
public ThreadGroup(ThreadGroup parent, String name)遞歸
private ThreadGroup(Void unused, ThreadGroup parent, String name)get
public class Demo { public static void main(String[] args) { //獲取當前線程所屬的線程組 ThreadGroup g1 = Thread.currentThread().getThreadGroup(); //定義一個線程組 ThreadGroup g2 = new ThreadGroup("g2"); //判斷當前線程所屬的線程組的父線程 System.out.println(g2.getParent()==g1);//true //定義新得線程,在以前得線程組之上 ThreadGroup g3 = new ThreadGroup(g2,"g3"); System.out.println(g3.getParent()==g2);//true } }
public int enumerate(Thread[] list)源碼
public int enumerate(Thread[] list,boolean recurse)it
上面的兩個方法其實是講ThreadGroup中的active線程所有複製到Thread數組中,其中recurse參數是true,則該方法會將全部的子group的active線程都遞歸到Thread數組中,經過源碼能夠得知enumerate(Thread[],true)==enumerate(list),這兩個方法都是調用的 private int enumerate(Thread list[], int n, boolean recurse)io
public int enumerate(Thread list[]) { checkAccess(); return enumerate(list, 0, true); } public int enumerate(Thread list[], boolean recurse) { checkAccess(); return enumerate(list, 0, recurse); } private int enumerate(Thread list[], int n, boolean recurse) { int ngroupsSnapshot = 0; ThreadGroup[] groupsSnapshot = null; synchronized (this) { if (destroyed) { return 0; } int nt = nthreads; if (nt > list.length - n) { nt = list.length - n; } for (int i = 0; i < nt; i++) { if (threads[i].isAlive()) { list[n++] = threads[i]; } } if (recurse) { ngroupsSnapshot = ngroups; if (groups != null) { groupsSnapshot = Arrays.copyOf(groups, ngroupsSnapshot); } else { groupsSnapshot = null; } } } if (recurse) { for (int i = 0 ; i < ngroupsSnapshot ; i++) { n = groupsSnapshot[i].enumerate(list, n, true); } } return n; }
執行結果: 3 2class
public int enumerate(ThreadGroup list[])
public int enumerate(ThreadGroup list[], boolean recurse)
public class ThreadGroupEnumerateThreadGroupsDemo { public static void main(String[] args) throws InterruptedException { ThreadGroup g1 = new ThreadGroup("g1"); ThreadGroup g2 = new ThreadGroup(g1,"g2"); TimeUnit.MILLISECONDS.sleep(2); ThreadGroup mainGroup = Thread.currentThread().getThreadGroup(); ThreadGroup[] list = new ThreadGroup[mainGroup.activeCount()]; int recurseSize = mainGroup.enumerate(list); System.out.println(recurseSize); recurseSize = mainGroup.enumerate(list,false); System.out.println(recurseSize); } }
執行結果: 2 1
activeGcount()用於獲取group中活躍的線程,這只是個估值。
activeGroupCount()用於獲取group中活躍的子group,這也是一個近似估值,該方法也會遞歸獲取全部的子group。
getMaxPriority()用於獲取group的優先級,默認狀況下,Group的優先級爲10,在該group中,全部的線程的優先級不能大於group的優先級。
getName():或與group的名字。
getParent()獲取group的父group,有就返回,沒有就返回null。
list():該方法沒有返回值,執行該方法會將group中全部的活躍的線程信息所有輸出到控制檯。
parentOf(ThreadGroup g):會判斷當前的group的是否是給定group的父group,另外若是給定大group的是給本身自己,那麼高返回true。
setMaxPriority(int pri)會指定group的最大優先級,最大優先級不能超過父group的最大優先級,該方法會把當前的線程組和子線程組的優先級都有影響。