《Java核心技术卷》读书笔记-并发(四) - 线程属性

67 阅读2分钟

线程属性

线程属性包括:线程优先级、守护线程、线程组、处理未捕获异常的处理器

线程优先级

每个线程都有一个优先级,默认继承父线程优先级。可以使用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接口:

  1. 如果该线程组有父线程组,那么父线程组处理。

  2. 否则,如果Thread.getDefaultExceptionHandler方法返回非空处理器,则调用该处理器。

  3. 否则,如果异常是个ThreadDeath的实例(调用了stop方法强行终止),什么也不做。

  4. 否则,栈轨迹打到System.err。