线程属性
线程属性包括:线程优先级、守护线程、线程组、处理未捕获异常的处理器
线程优先级
每个线程都有一个优先级,默认继承父线程优先级。可以使用setPriority方法设置。相关参数在Thread类中定义:
/**
* The minimum priority that a thread can have.
*/
public final static int MIN_PRIORITY = 1;
/**
* The default priority that is assigned to a thread.
*/
public final static int NORM_PRIORITY = 5;
/**
* The maximum priority that a thread can have.
*/
public final static int MAX_PRIORITY = 10;
注意,不建议让功能的正确性依赖于优先级。因为优先级高度依赖于系统,不同的平台优先级实现不一样,对应虚拟机实现也不一样,优先级个数也许更多,也可能更少。例如,在Oracle为Linux提供的Java虚拟机中,线程的优先级被忽略,即所有线程优先级相同。
如果确实要使用优先级,需要注意:如果有几个高优先级的线程没有进入Runnable状态,低优先级的线程可能永远也不能执行。
守护线程
守护线程唯一的用途就是为其他线程提供服务,与其他线程的区别也只在于当只剩下守护线程时,虚拟机就退出了。因此守护线程应该永远不去访问固有资源,如文件、数据库,因为它会在任何时候甚至在一个操作的中间发生中断。
设置守护线程的方式:
t.setDaemon(true);
未捕获异常处理器
我们知道,非受查异常会导致线程异常终止,但是这些异常不需要catch,在线程死亡之前,异常会被传递到一个用于未捕获异常的处理器。
该处理器需实现Thread.UncaughtExceptionExceptionHandler接口。可以用setUncaughtExceptionHandler方法安装处理器,Thread类的静态方法setDefaultUncaughtExceptionHandler为所有线程安装一个默认处理器。如果不为独立的线程安装处理器,默认处理器会是该线程的ThreadGroup对象。
线程组ThreadGroup
线程组是一个可以统一管理的线程集合。默认情况下,创建的所有线程属于相同的线程组,但是,也可能会建立其他的组。由于更好特性的引入,如今不建议使用线程组进行线程集合的操作。
由上文可以知道,该对象可以作为处理器,其实现了Thread.UncaughtExceptionExceptionHandler接口:
-
如果该线程组有父线程组,那么父线程组处理。
-
否则,如果Thread.getDefaultExceptionHandler方法返回非空处理器,则调用该处理器。
-
否则,如果异常是个ThreadDeath的实例(调用了stop方法强行终止),什么也不做。
-
否则,栈轨迹打到System.err。