一、線程組
[java]view plaincopy
/**
*?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.
*?
*?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
*/
一個線程組代表了一系列的線程。并且挎春,一個線程組可以包括其他的線程組。除了初始線程組外,每個線程組都有一個父線程組直奋,類似于樹的結(jié)構(gòu)能庆。
一個線程可以訪問它所在線程組的信息, 不可以訪問它父線程組和其他線程組的信息脚线。
從這段話中可以大概明白線程組的概念搁胆,所有的線程和線程組構(gòu)成一個樹的結(jié)構(gòu),如下:
查看Thread的API殉挽,可以看到丰涉,創(chuàng)建一個線程可以指定它的線程組和不指定線程組。如果指定其所屬的線程組斯碌,那么該線程組是創(chuàng)建它的線程所屬線程組的子線程組一死。如果不指定線程組,則屬于默認情況傻唾,該線程和創(chuàng)建它的線程在同一個線程組投慈。
以上面的圖舉個簡單的例子:
如果main線程創(chuàng)建了Thread1線程,沒有指定Thread1所在的線程組冠骄,那么Thread1就默認和main線程屬于同一個線程組伪煤,即系統(tǒng)線程組。
如果main線程創(chuàng)建了Thread3線程凛辣,沒指定Thread3所在的線程組為線程組1抱既,那么線程組1就屬于系統(tǒng)線程組,和main線程在樹結(jié)構(gòu)中平級扁誓。
一旦某個線程加入了指定線程組之后防泵,該線程將一直屬于該線程組,直到該線程死亡蝗敢,線程運行中途不能改變它所屬的線程組捷泞。因為指定線程所在線程組是在創(chuàng)建線程的視乎完成的,所以之后不能再修改它所在的線程組寿谴。
下面是ThreadGroup的方法摘要
方法摘要
intactiveCount()
返回此線程組中活動線程的估計數(shù)锁右。
intactiveGroupCount()
返回此線程組中活動線程組的估計數(shù)。
booleanallowThreadSuspension(boolean?b)
已過時讶泰。此調(diào)用的定義取決于suspend()咏瑟,它被廢棄了。更進一步地說痪署,此調(diào)用的行為從不被指定响蕴。
voidcheckAccess()
確定當前運行的線程是否有權(quán)修改此線程組。
voiddestroy()
銷毀此線程組及其所有子組惠桃。
把此線程組及其子組中的所有活動線程復制到指定數(shù)組中浦夷。
intenumerate(Thread[]?list, boolean?recurse)
把此線程組中的所有活動線程復制到指定數(shù)組中辖试。
intenumerate(ThreadGroup[]?list)
把對此線程組中的所有活動子組的引用復制到指定數(shù)組中。
intenumerate(ThreadGroup[]?list, boolean?recurse)
把對此線程組中的所有活動子組的引用復制到指定數(shù)組中劈狐。
intgetMaxPriority()
返回此線程組的最高優(yōu)先級罐孝。
返回此線程組的名稱。
返回此線程組的父線程組肥缔。
voidinterrupt()
中斷此線程組中的所有線程莲兢。
booleanisDaemon()
測試此線程組是否為一個后臺程序線程組。
booleanisDestroyed()
測試此線程組是否已經(jīng)被銷毀续膳。
voidlist()
將有關(guān)此線程組的信息打印到標準輸出改艇。
booleanparentOf(ThreadGroupg)
測試此線程組是否為線程組參數(shù)或其祖先線程組之一。
voidresume()
已過時坟岔。此方法只用于聯(lián)合Thread.suspend和ThreadGroup.suspend時谒兄,因為它們所固有的容易導致死鎖的特性,所以兩者都已廢棄社付。有關(guān)詳細信息承疲,請參閱Thread.suspend()。
voidsetDaemon(boolean?daemon)
更改此線程組的后臺程序狀態(tài)鸥咖。
voidsetMaxPriority(int?pri)
設(shè)置線程組的最高優(yōu)先級燕鸽。
voidstop()
已過時。此方法具有固有的不安全性啼辣。有關(guān)詳細信息啊研,請參閱Thread.stop()。
voidsuspend()
已過時鸥拧。此方法容易導致死鎖党远。有關(guān)詳細信息,請參閱Thread.suspend()住涉。
返回此線程組的字符串表示形式麸锉。
voiduncaughtException(Threadt,Throwablee)
當此線程組中的線程因為一個未捕獲的異常而停止钠绍,并且線程沒有安裝特定Thread.UncaughtExceptionHandler時舆声,由 Java Virtual Machine 調(diào)用此方法。
二柳爽、線程組與未處理的異常
從JDK1.5開始媳握,Java加強了線程的異常處理,如果線程執(zhí)行過程中拋出了一個未處理的異常磷脯,JVM在結(jié)束該線程之前會自動查找是否有對應的Thread.UncaughtExceptionHandler對象蛾找,如果找到該處理器對象,將會調(diào)用該對象的uncaughtException(Thread t,Throwable e)方法來處理該異常赵誓。
Thread.UncaughtExceptionHandler是Thread類的一個內(nèi)部公共靜態(tài)接口打毛,該接口內(nèi)只有一個方法:
void uncaughtException(Thread t,Throwable t)柿赊,該方法中的t代表出現(xiàn)異常的線程,而e代表該線程拋出的異常幻枉。
Thread類提供了兩個方法來設(shè)置異常處理器:
public static void setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler eh)
線程類的所有線程實例設(shè)置默認的異常處理器
public void setUncaughtExceptionHandler(UncaughtExceptionHandler eh)
為指定線程的實例設(shè)置異常處理器
ThreadGroup類實現(xiàn)了Thread.UncaughtExceptionHandler接口碰声,所以每個線程所屬的線程組將會作為默認的異常處理器。當一個線程拋出未處理的異常時熬甫,JVM會首先查找該異常對應的異常處理器(setUncaughtExceptionHandler方法設(shè)置的異常處理器)胰挑,如果找到該異常處理器,將調(diào)用該異常處理器處理該異常椿肩,否則瞻颂,JVM將會調(diào)用該線程所屬的線程組對象的uncaughtException方法來處理該異常,線程組處理異常的流程如下:
1)郑象、如果該線程組有父線程組贡这,則調(diào)用父線程組的uncaughtException方法來處理該異常
2)、否則扣唱,如果該線程實例所屬的線程類有默認的異常處理器(由setDefaultUncaughtExceptionHandler方法設(shè)置的異常處理器)藕坯,那么就調(diào)用該異常處理器來處理該異常
3)、否則噪沙,將異常調(diào)試棧的信息打印到System.err錯誤輸出流炼彪,并結(jié)束該線程。
看下面的例子:
[java]view plaincopy
classMyHandlerimplementsThread.UncaughtExceptionHandler{
@Override
publicvoiduncaughtException(Thread?t,?Throwable?e)?{
System.out.println("出現(xiàn)了異常");
e.printStackTrace();
}
}
publicclassTest{
publicstaticvoidmain(String[]?args)?{
Thread.currentThread().setUncaughtExceptionHandler(newMyHandler());
inta=1/0;
}
}
在主線程中設(shè)置了異常處理器正歼,最后捕獲了異常辐马。
三、Callable和Future
參考:http://lavasoft.blog.51cto.com/62575/222082
四局义、volatile關(guān)鍵字
參考:http://lavasoft.blog.51cto.com/62575/222076
五喜爷、顯示同步鎖
參考:http://lavasoft.blog.51cto.com/62575/222084
轉(zhuǎn)自:http://blog.csdn.net/lonelyroamer/article/details/7993502