1. 线程优先权
每个线程都有一定的优先权,且默认从父线程继承优先权,也就是运行这个线程的线程。可以使用setPriority方法设置,从MIN_PRIORITY(1)到MAX_PRIORITY(10),NORM_PRIORITY是5。
然而线程优先权更多的是由系统决定的。如在WinXP/NT有若干个优先等级,某些Java的优先级也自动对应到相应的等级上。但是在Sun JVM for Linux中,线程优先权被忽视,所有的线程享有相同的优先权。
所以,最好把线程仅仅看成是对线程管理器的hint。不要由线程优先级来决定你的程序结构。
注意:在使用优先级的时候,如果某几个很少会停滞的线程享有高优先级,很有可能低优先级的线程就不会被运行。
2. Daemon进程
把一个进程变为daemon进程可以调用方法setDaemon(true)。所谓daemon,就是只用来服务其他进程的进程,所以当只有daemon进程运行时,JVM就退出了。
3. 进程组
ThreadGroup g = new ThreadGroup(String groupName);
注意groupName必须唯一。
加入线程:
Thread t = new Thread(g, String threadName);
进程组中可以有子进程组,新创建的子进程组默认属于当前进程组。
ThreadGroup类的方法:
int activeCount() 返回组中活动的线程数。
int enumerate(Thread[] list) 获得组中每个活动进程的引用,返回实际加入list的进程数。
ThreadGroup getParent()
void interrupt 中止所有的进程和子进程组。
4. 处理未捕获异常
线程的run方法并不能抛出任何checked异常,但因为一个unchecked异常而结束。
在线程结束前,异常会被传递给一个处理器。
异常处理器必须实现了Thread.UncaughtExceptionHandler接口,后者只有一个方法
void uncaughtException(Thread t, Throwable e)
可以在任何线程中使用setUncaughtExceptionHandler方法设置处理器,也可以使用Thread的静态方法setDefaultUncaughtExceptionHandler为每个线程指定默认的处理器。如果不为每个独立的线程指定处理器,处理器默认为该线程的线程组对象。
ThreadGroup类实现了Thread.UncaughtExceptionHandler接口,它的uncaughtException方法按下列步骤进行:
1)如果该进程组有父进程组,调用父进程组的uncaughtException方法。
2)否则,如果Thread.getDefaultUncaughtExceptionHandler返回一个非null的引用,该处理器被调用。
3)如果仍未找到,且Throwable参数是ThreadDeath的实例,不进行任何处理。
4)上述都未执行的话,进程名和Throwable参数的调用栈就会输出到System.err上