1. 線程優(yōu)先權(quán)
每個線程都有一定的優(yōu)先權(quán),且默認從父線程繼承優(yōu)先權(quán),也就是運行這個線程的線程。可以使用setPriority方法設(shè)置,從MIN_PRIORITY(1)到MAX_PRIORITY(10),NORM_PRIORITY是5。
然而線程優(yōu)先權(quán)更多的是由系統(tǒng)決定的。如在WinXP/NT有若干個優(yōu)先等級,某些Java的優(yōu)先級也自動對應(yīng)到相應(yīng)的等級上。但是在Sun JVM for Linux中,線程優(yōu)先權(quán)被忽視,所有的線程享有相同的優(yōu)先權(quán)。
所以,最好把線程僅僅看成是對線程管理器的hint。不要由線程優(yōu)先級來決定你的程序結(jié)構(gòu)。
注意:在使用優(yōu)先級的時候,如果某幾個很少會停滯的線程享有高優(yōu)先級,很有可能低優(yōu)先級的線程就不會被運行。
2. Daemon進程
把一個進程變?yōu)閐aemon進程可以調(diào)用方法setDaemon(true)。所謂daemon,就是只用來服務(wù)其他進程的進程,所以當(dāng)只有daemon進程運行時,JVM就退出了。
3. 進程組
ThreadGroup g = new ThreadGroup(String groupName);
注意groupName必須唯一。
加入線程:
Thread t = new Thread(g, String threadName);
進程組中可以有子進程組,新創(chuàng)建的子進程組默認屬于當(dāng)前進程組。
ThreadGroup類的方法:
int activeCount() 返回組中活動的線程數(shù)。
int enumerate(Thread[] list) 獲得組中每個活動進程的引用,返回實際加入list的進程數(shù)。
ThreadGroup getParent()
void interrupt 中止所有的進程和子進程組。
4. 處理未捕獲異常
線程的run方法并不能拋出任何checked異常,但因為一個unchecked異常而結(jié)束。
在線程結(jié)束前,異常會被傳遞給一個處理器。
異常處理器必須實現(xiàn)了Thread.UncaughtExceptionHandler接口,后者只有一個方法
void uncaughtException(Thread t, Throwable e)
可以在任何線程中使用setUncaughtExceptionHandler方法設(shè)置處理器,也可以使用Thread的靜態(tài)方法setDefaultUncaughtExceptionHandler為每個線程指定默認的處理器。如果不為每個獨立的線程指定處理器,處理器默認為該線程的線程組對象。
ThreadGroup類實現(xiàn)了Thread.UncaughtExceptionHandler接口,它的uncaughtException方法按下列步驟進行:
1)如果該進程組有父進程組,調(diào)用父進程組的uncaughtException方法。
2)否則,如果Thread.getDefaultUncaughtExceptionHandler返回一個非null的引用,該處理器被調(diào)用。
3)如果仍未找到,且Throwable參數(shù)是ThreadDeath的實例,不進行任何處理。
4)上述都未執(zhí)行的話,進程名和Throwable參數(shù)的調(diào)用棧就會輸出到System.err上