Java多線程的其他知識(shí)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
一、線程組
/** * A thread group represents a set of threads. In addition, a thread * group can also include other thread groups. The thread groups form * a tree in which every thread group except the initial thread group * has a parent. * <p> * A thread is allowed to access information about its own thread * group, but not to access information about its thread group's * parent thread group or any other thread groups. * * @author unascribed * @version 1.66, 03/13/08 * @since JDK1.0 */
一個(gè)線程組代表了一系列的線程。并且,一個(gè)線程組可以包括其他的線程組。除了初始線程組外,每個(gè)線程組都有一個(gè)父線程組,類(lèi)似于樹(shù)的結(jié)構(gòu)。
一個(gè)線程可以訪問(wèn)它所在線程組的信息, 不可以訪問(wèn)它父線程組和其他線程組的信息。
從這段話中可以大概明白線程組的概念,所有的線程和線程組構(gòu)成一個(gè)樹(shù)的結(jié)構(gòu),如下:
查看Thread的API,可以看到,創(chuàng)建一個(gè)線程可以指定它的線程組和不指定線程組。如果指定其所屬的線程組,那么該線程組是創(chuàng)建它的線程所屬線程組的子線程組。如果不指定線程組,則屬于默認(rèn)情況,該線程和創(chuàng)建它的線程在同一個(gè)線程組。
以上面的圖舉個(gè)簡(jiǎn)單的例子:
如果main線程創(chuàng)建了Thread1線程,沒(méi)有指定Thread1所在的線程組,那么Thread1就默認(rèn)和main線程屬于同一個(gè)線程組,即系統(tǒng)線程組。
如果main線程創(chuàng)建了Thread3線程,沒(méi)指定Thread3所在的線程組為線程組1,那么線程組1就屬于系統(tǒng)線程組,和main線程在樹(shù)結(jié)構(gòu)中平級(jí)。
一旦某個(gè)線程加入了指定線程組之后,該線程將一直屬于該線程組,直到該線程死亡,線程運(yùn)行中途不能改變它所屬的線程組。因?yàn)橹付ň€程所在線程組是在創(chuàng)建線程的視乎完成的,所以之后不能再修改它所在的線程組。
下面是ThreadGroup的方法摘要
二、線程組與未處理的異常
從JDK1.5開(kāi)始,Java加強(qiáng)了線程的異常處理,如果線程執(zhí)行過(guò)程中拋出了一個(gè)未處理的異常,JVM在結(jié)束該線程之前會(huì)自動(dòng)查找是否有對(duì)應(yīng)的Thread.UncaughtExceptionHandler對(duì)象,如果找到該處理器對(duì)象,將會(huì)調(diào)用該對(duì)象的uncaughtException(Thread t,Throwable e)方法來(lái)處理該異常。
Thread.UncaughtExceptionHandler是Thread類(lèi)的一個(gè)內(nèi)部公共靜態(tài)接口,該接口內(nèi)只有一個(gè)方法:
void uncaughtException(Thread t,Throwable t),該方法中的t代表出現(xiàn)異常的線程,而e代表該線程拋出的異常。
Thread類(lèi)提供了兩個(gè)方法來(lái)設(shè)置異常處理器:
public static void setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler eh)
線程類(lèi)的所有線程實(shí)例設(shè)置默認(rèn)的異常處理器
public void setUncaughtExceptionHandler(UncaughtExceptionHandler eh)
為指定線程的實(shí)例設(shè)置異常處理器
ThreadGroup類(lèi)實(shí)現(xiàn)了Thread.UncaughtExceptionHandler接口,所以每個(gè)線程所屬的線程組將會(huì)作為默認(rèn)的異常處理器。當(dāng)一個(gè)線程拋出未處理的異常時(shí),JVM會(huì)首先查找該異常對(duì)應(yīng)的異常處理器(setUncaughtExceptionHandler方法設(shè)置的異常處理器),如果找到該異常處理器,將調(diào)用該異常處理器處理該異常,否則,JVM將會(huì)調(diào)用該線程所屬的線程組對(duì)象的uncaughtException方法來(lái)處理該異常,線程組處理異常的流程如下:
1)、如果該線程組有父線程組,則調(diào)用父線程組的uncaughtException方法來(lái)處理該異常
2)、否則,如果該線程實(shí)例所屬的線程類(lèi)有默認(rèn)的異常處理器(由setDefaultUncaughtExceptionHandler方法設(shè)置的異常處理器),那么就調(diào)用該異常處理器來(lái)處理該異常
3)、否則,將異常調(diào)試棧的信息打印到System.err錯(cuò)誤輸出流,并結(jié)束該線程。
看下面的例子:
class MyHandler implements Thread.UncaughtExceptionHandler{ @Override public void uncaughtException(Thread t, Throwable e) { System.out.println("出現(xiàn)了異常"); e.printStackTrace(); } } public class Test{ public static void main(String[] args) { Thread.currentThread().setUncaughtExceptionHandler(new MyHandler()); int a=1/0; } }
在主線程中設(shè)置了異常處理器,最后捕獲了異常。
以上所述是小編給大家介紹的Java多線程的其他知識(shí)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
淺談java線程中生產(chǎn)者與消費(fèi)者的問(wèn)題
下面小編就為大家?guī)?lái)一篇淺談java線程中生產(chǎn)者與消費(fèi)者的問(wèn)題。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-07-07Java即將引入新對(duì)象類(lèi)型來(lái)解決內(nèi)存使用問(wèn)題
這篇文章主要介紹了Java即將引入新對(duì)象類(lèi)型來(lái)解決內(nèi)存使用問(wèn)題,文章通過(guò)圍繞主題的相關(guān)資料展開(kāi)詳細(xì)內(nèi)容,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-05-05簡(jiǎn)述Java中進(jìn)程與線程的關(guān)系_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
在 Java 語(yǔ)言中,對(duì)進(jìn)程和線程的封裝,分別提供了 Process 和 Thread 相關(guān)的一些類(lèi)。本文首先簡(jiǎn)單的介紹如何使用這些類(lèi)來(lái)創(chuàng)建進(jìn)程和線程2017-05-05java多線程累加計(jì)數(shù)的實(shí)現(xiàn)方法
在多線程協(xié)作任務(wù)中,如何計(jì)算也是很重的,這篇文章主要介紹了java多線程累加計(jì)數(shù)的實(shí)現(xiàn)方法,感興趣的朋友可以了解一下2021-05-05maven安裝、使用、配置本地倉(cāng)庫(kù)、idea配置maven以及解決plugins報(bào)錯(cuò)問(wèn)題
本地倉(cāng)庫(kù)是遠(yuǎn)程倉(cāng)庫(kù)的一個(gè)緩沖和子集,當(dāng)你構(gòu)建Maven項(xiàng)目時(shí)首先會(huì)從本地倉(cāng)庫(kù)查找資源,如果沒(méi)有那么Maven會(huì)從遠(yuǎn)程倉(cāng)庫(kù)下載到你本地倉(cāng)庫(kù),這篇文章主要給大家介紹了關(guān)于maven安裝、使用、配置本地倉(cāng)庫(kù)、idea配置maven以及解決plugins報(bào)錯(cuò)問(wèn)題的相關(guān)資料,需要的朋友可以參考下2024-01-01Java生成Echarts表圖的2種實(shí)現(xiàn)方案
這篇文章主要給大家介紹了關(guān)于Java生成Echarts表圖的2種實(shí)現(xiàn)方案,ECharts是一款功能非常強(qiáng)大的JavaScript圖表庫(kù),文中通過(guò)代碼實(shí)例介紹的非常詳細(xì),需要的朋友可以參考下2023-09-09Web三大組件之Filter,Listener和Servlet詳解
這篇文章主要為大家詳細(xì)介紹了Web三大組件之Filter,Listener和Servlet,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-03-03