1 簡介
線程組(ThreadGroup)是一個線程集合。是爲了更方便地管理線程。線程組是父子結構的,一個線程組可以集成其他線程組,同時也可以擁有其他子線程組。從結構上看,線程組是一個樹形結構,每個線程都隸屬於一個線程組,線程組又有父線程組,這樣追溯下去,可以追溯到一個根線程組——System線程組。
2 線程組樹的結構
- JVM創建的system線程組是用來處理JVM的系統任務的線程組,例如對象的銷燬等
- system線程組的直接子線程組是main線程組,這個線程組至少包含一個main線程,用於執行main方法
- main線程組的子線程組就是應用程序創建的線程組。
你可以在main方法中看到JVM創建的system線程組和main線程組:
一個線程可以訪問其所屬線程組的信息,但不能訪問其所屬線程組的父線程組或者其他線程組的信息。
3 線程組的構造
java.lang.ThreadGroup
提供了兩個構造函數:
Constructor | Description |
---|---|
ThreadGroup(String name) | 根據線程組名稱創建線程組,其父線程組爲main線程組 |
ThreadGroup(ThreadGroup parent, String name) | 根據線程組名稱創建線程組,其父線程組爲指定的parent線程組 |
- 兩個構造函數的用法
4 API
1.public ThreadGroup(ThreadGroup parent, String name)
分析:構建一個新的線程組,這個新組的父級是當前正在運行的線程的線程組;
2.public ThreadGroup(ThreadGroup parent, String name)
分析:構建一個新的線程組,這個新租的父級是指定的線程組;
3.public int activeCount()
分析:返回此線程組及其子組中活動線程的數量的估計值,遞歸遍歷該線程組中所有的子組;
返回的值只是一個估計值,因爲用這種方法遍歷內部數據結構因爲線程的數量可能會動態發生變化,並且可能會受到某些系統線程的影響,此方法主要用於調試和監視目的;
4.public int activeGroupCount()
分析:返回此線程組及其子組中活動組的數目的估計值。遞歸遍歷該線程組中的所有子羣。返回的值只是一個估計值,因爲線程組的數量可能會動態變化,而這種方法遍歷內部數據結構。此方法主要用於調試和監視目的。
5.public final void checkAccess()
分析:確定當前運行的線程是否具有修改此線程組的權限。
如果存在安全管理器,它的checkaccess方法調用這個線程組作爲其參數。這可能會導致拋出SecurityException。
6.public final void destroy()
分析:破壞此線程組及其所有子組,此線程組必須爲空,表示此線程組中的所有線程必須都停止;
7.public int enumerate(Thread[] list)
分析:將這個線程組複製到它所在的組及其子組中;
8.public int enumerate(Thread[] list, boolean recurse)
分析:將這個線程組複製到它所在的線程組,如果recurse是true,此方法遞歸枚舉此線程組的所有子組,並對這些子組中的每個活動線程進行引用。如果數組太短無法保存所有的線程,額外的線程將被默默的忽略;
9.public int enumerate(ThreadGroup[] list)
分析:複製線程組中的活躍線程引用到它當前線程組及其子組中;
10.public int enumerate(ThreadGroup[] list, boolean recurse)
分析:複製線程組中的活躍線程引用到它當前線程組及其子組中,如果recurse是true,此方法遞歸枚舉此線程組的所有子組,並對這些子組中的每個活動線程組進行引用。
11.public final int getMaxPriority()
分析:返回此線程組的最大優先級。作爲該組的一部分的線程不能具有比優先級最高的優先級。
12.public final String getName()
分析:返回此線程組的名稱;
13.public final ThreadGroup getParent()
分析:返回此線程組的父級;
14.public final void interrupt()
分析:終端此線程組中的所有線程;
15.public final boolean isDaemon()
分析:測試此線程組是否是守護線程組。當終止最後一個線程或它的最後一個線程組被銷燬時,守護線程組會自動銷燬;
16.public boolean isDestroyed()
分析:測試此線程組是否已被銷燬;
17.public void list()
分析:將此線程組的信息打印到標準輸出。此方法僅用於調試。
18.public final boolean parentOf(ThreadGroup g)
分析:測試此線程組是線程組參數還是其祖先線程組之一;
19.public final void setDaemon(boolean daemon)
分析:更改此線程組的守護進程狀態;
20.public final void setMaxPriority(int pri)
分析:設置組的最大優先級。線程組中具有較高優先級的線程不會受到影響
查看當前線程組的信息。
public static void list(){
ThreadGroup tg = new ThreadGroup ("subgroup 1");
Thread t1 = new Thread (tg, "thread 1");
Thread t2 = new Thread (tg, "thread 2");
Thread t3 = new Thread (tg, "thread 3");
tg = new ThreadGroup ("subgroup 2");
Thread t4 = new Thread (tg, "my thread");
tg = Thread.currentThread ().getThreadGroup ();
int agc = tg.activeGroupCount ();
System.out.println ("Active thread groups in " + tg.getName () + " thread group: " + agc);
tg.list ();
}
輸出如下:
Active thread groups in main thread group: 2
java.lang.ThreadGroup[name=main,maxpri=10]
Thread[main,5,main]
java.lang.ThreadGroup[name=subgroup 1,maxpri=10]
java.lang.ThreadGroup[name=subgroup 2,maxpri=10]
5 終止線程組中的所有線程
一個線程不應由其他線程來強制中斷或停止,而是應該由線程自己自行停止。
因此 Thread.currentThread().stop(), Thread.currentThread().suspend(), Thread.currentThread().resume() 都已經被廢棄了。
interrupt() 方法的作用是通知線程應該中斷了,具體到底中斷還是繼續運行,由被通知的線程處理。