您好,登錄后才能下訂單哦!
這篇文章主要講解了“java ThreadGroup的作用及方法有哪”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“java ThreadGroup的作用及方法有哪”吧!
java ThreadGroup的作用及方法
Field
私有構(gòu)造方法
公共構(gòu)造方法
公共方法
特殊的一個(gè)方法
java 線程組(ThreadGroup類)
ThreadGroup線程組,java對(duì)這個(gè)類的描述呢就是
“線程組表示一組線程。此外,線程組還可以包括其他線程組。線程組形成一個(gè)樹(shù),其中除了初始線程組之外的每個(gè)線程組都有一個(gè)父線程組。
允許線程訪問(wèn)關(guān)于其線程組的信息,但不允許訪問(wèn)關(guān)于其線程組的父線程組或任何其他線程組的信息?!?/p>
ThreadGroup并不是算是標(biāo)注容器,因?yàn)?,最后你?huì)發(fā)現(xiàn)這個(gè)家伙是沒(méi)有public的 add,remove方法的。那怎么把線程放到線程組里面呢?
答案是 在new Thread(參數(shù)),將ThreadGroup當(dāng)做參數(shù)傳進(jìn)去。
private final ThreadGroup parent;// 線程組的線程組,final 表名 線程組 不可以隨便變更 String name; //名字 int maxPriority;//這個(gè)線程組 的元素 例如 線程 線程組的最大優(yōu)先級(jí),具體實(shí)現(xiàn)是 當(dāng)線程或者線程組自身設(shè)定優(yōu)先級(jí)的時(shí)候,總是取 自己父線程組的優(yōu)先級(jí)和要設(shè)定的優(yōu)先級(jí)的最小值 boolean destroyed;//判斷是否銷毀了 boolean daemon;//當(dāng)守護(hù)進(jìn)程線程組的最后一個(gè)線程停止或最后一個(gè)線程組被銷毀時(shí),將自動(dòng)銷毀該線程組。 int nUnstartedThreads = 0; int nthreads;//這個(gè)線程組 里面的線程數(shù)量 Thread threads[];//線程數(shù)組 ,持有 線程的引用 int ngroups;//這個(gè)線程組 里面的線程組數(shù)量 ThreadGroup groups[];//線程組數(shù)組 ,持有 線程組的引用
創(chuàng)建不在任何線程組中的空線程組。
此方法用于創(chuàng)建系統(tǒng)線程組。
private ThreadGroup()
//創(chuàng)建一個(gè)新線程組。這個(gè)新組的父線程組是指定的線程組parent。線程組的 名字 就是name 會(huì)對(duì) parent 調(diào)用checkAccess() 確定當(dāng)前運(yùn)行的線程是否具有修改此線程組的權(quán)限(比如 設(shè)置setDaemon)。有可能會(huì)拋出SecurityException異常 public ThreadGroup(ThreadGroup parent, String name) //構(gòu)造一個(gè)新線程組。這個(gè)新組的父線程組是當(dāng)前運(yùn)行線程的線程組。 就是調(diào)用上面的方法 public ThreadGroup(String name) { this(Thread.currentThread().getThreadGroup(), name); }
public final String getName()//返回線程組名字 //返回父線程組 parent 調(diào)用checkAccess() 確定當(dāng)前運(yùn)行的線程是否具有修改此線程組的權(quán)限。 //有可能會(huì)拋出SecurityException異常 public final ThreadGroup getParent() public final int getMaxPriority() //返回線程組優(yōu)先級(jí) //測(cè)試此線程組是否是守護(hù)進(jìn)程線程組。當(dāng)守護(hù)進(jìn)程線程組的最后一個(gè)線程停止或最后一個(gè)線程組被銷毀時(shí),將自動(dòng)銷毀該線程組。 public final boolean isDaemon() public synchronized boolean isDestroyed()//測(cè)試該線程組是否已被銷毀。 public final void setDaemon(boolean daemon)//將線程組設(shè)置成守護(hù)線程組 ,會(huì)檢查 當(dāng)前線程是否具有權(quán)限 修改線程組 //設(shè)定當(dāng)前線程組以及子線程組的 優(yōu)先級(jí),取pri和當(dāng)前線程組的父線程組的優(yōu)先級(jí)的較小值為準(zhǔn)。 //這個(gè)之所以會(huì)限制 Thread的最大優(yōu)先級(jí) //具體實(shí)現(xiàn)是 當(dāng)線程或者線程組自身設(shè)定優(yōu)先級(jí)的時(shí)候,總是取 自己父線程組的優(yōu)先級(jí)和要設(shè)定的優(yōu)先級(jí)的最小值 //會(huì)檢查 當(dāng)前線程是否具有權(quán)限 修改線程組 public final void setMaxPriority(int pri) //測(cè)試,當(dāng)前這個(gè)線程組是否是 g線程組的父線程 或者參數(shù) public final boolean parentOf(ThreadGroup g) //檢查 當(dāng)前線程是否具有權(quán)限 修改線程組 比如在當(dāng)前線程中 用線程組自己本身調(diào)用它自己的一些方法 ,都會(huì)檢查 public final void checkAccess() //返回此線程組及其子線程組中活動(dòng)線程數(shù)量的估計(jì)值。遞歸地遍歷此線程組中的所有子組。 如果當(dāng)前線程組已經(jīng)destroyed,返回0 public int activeCount() //將線程組的中線程 活動(dòng)線程放入list[]里面 會(huì)自動(dòng)擴(kuò)大這個(gè)數(shù)組,如果{@code recurse}為{@code true},則此方法遞歸枚舉此線程組的所有子組,并引用這些子組中的每個(gè)活動(dòng)線程 //注意這個(gè)聲明數(shù)組的方式 public int enumerate(Thread list[], boolean recurse) //和上面方法類似 只不過(guò) 下面這個(gè) ThreadGroup public int enumerate(ThreadGroup list[]) public int enumerate(ThreadGroup list[], boolean recurse) //返回此線程組及其子組中活動(dòng)組的數(shù)量的估計(jì)值。遞歸地遍歷此線程組中的所有子組。 public int activeGroupCount() //interrupt此線程組中的所有線程。包括 子線程組中的線程 public final void interrupt()
public void uncaughtException(Thread t, Throwable e)
這個(gè)方法呢,作用很簡(jiǎn)單 使 t 線程 拋出一個(gè) Throwable e的異常。這個(gè)e 異常 也是你自己定義的。如果前面設(shè)置了,
Thread.setDefaultUncaughtExceptionHandler((t, e) -> { System.out.println("默認(rèn)的 "+t.getName()); System.out.println("默認(rèn)的 "+e); });
那么,在上面自定義的Throwable 會(huì)被這個(gè)捕獲,如果沒(méi)有設(shè)置,就打印標(biāo)注錯(cuò)誤流。對(duì)這個(gè)方法,存在的意義 比較困惑
Thread.setDefaultUncaughtExceptionHandler((t, e) -> { System.out.println("默認(rèn)的 "+t.getName()); System.out.println("默認(rèn)的 "+e); }); ThreadGroup threadGroup = new ThreadGroup("father"); Thread two = new Thread(threadGroup,"two"); threadGroup.uncaughtException(two,new IllegalAccessException("ssss"));
運(yùn)行結(jié)果
線程組表示一個(gè)線程的集合。線程組也可以包含其他線程組。線程執(zhí)行完就會(huì)被回收。
private static void methodA() { MyThread my = new MyThread() ; //創(chuàng)建線程類對(duì)象 Thread t1 = new Thread(my, "線程1") ; Thread t2 = new Thread(my, "線程2") ; //public final ThreadGroup getThreadGroup()返回該線程所屬的線程組 ThreadGroup tg1 = t1.getThreadGroup() ; ThreadGroup tg2 = t2.getThreadGroup() ; //public final String getName():返回線程組的名稱 System.out.println(tg1.getName()); //main System.out.println(tg2.getName());//main //所有的線程它默認(rèn)的線程組名稱:main(主線程),主線程是包含在線程組里面的 System.out.println(Thread.currentThread().getThreadGroup().getName());//main }
private static void methodB() { //public ThreadGroup(String name)構(gòu)造一個(gè)新線程組 ThreadGroup tg = new ThreadGroup("新的線程組") ; MyThread my = new MyThread() ; //Thread(ThreadGroup group, Runnable target, String name) Thread t1 = new Thread(tg, my, "線程1") ; Thread t2 = new Thread(tg, my, "線程2") ; //直接獲取線程組名稱 System.out.println(t1.getThreadGroup().getName()); System.out.println(t2.getThreadGroup().getName()); }
感謝各位的閱讀,以上就是“java ThreadGroup的作用及方法有哪”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)java ThreadGroup的作用及方法有哪這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。