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