线程属性包括:线程优先级、守护线程、线程组和处理未捕获
异常的
处理器。
1.线程优先级
在Java程序设计语言中,每一个线程都有一个优先级。默认情况下,一个线程继承它的父线程的优先级。可以将优先级设置为MIN_PRIORITY(在Thread类中定义为1)与MAX_PRIORITY(定义为10)之间的任何值。
每当线程调度器有机会选择新线程时,它首先选择有较高优先级的线程。注意:线程优先级是高度依赖于系统的。当虚拟机依赖于宿主机平台的线程实现机制时,JAVA的优先级被映射到宿主机平台的优先级上,优先级个数也许更多,也许更少。Windows有7个优先级别。Linux下线程的优先级被忽略--所有线程具有相同的优先级。
注意:如果有几个高优先级的线程没有进入非活动状态,低优先级的线程可能永远也不能执行。
2.守护线程
setDaemon(true) : 将线程转换为守护线程(daemon
thread)。守护线程的唯一作用是为其他线程提供服务。当只剩下守护线程时,虚拟机就退出了。
注意:守护线程应该永远不去访问固有资源,如文件、数据库。因为它会在任何时候甚至在一个操作的中间发生中断。
e.g.计时线程定时发送“时间嘀嗒”信号给其他线程或清空过时的高速
缓存项的线程。
3.未捕获
异常处理器
原因:线程的run方法不能抛出任何被检测的异常,但是,不被检测的异常会导致线程终止。在这种情况下,线程就死亡了。
处理办法:不需要任何catch子句来处理可以被传播的异常。相反,就
在线程死亡之前,异常被传递到一个用于未捕获异常的处理器。
未捕获异常的处理器:
(1).该处理器必须属于一个实现了Thread.UncaughtExceptionHandler
接口的类。该类只有一个方法 void uncaughtException(Thread t, Throwable e)
(2).也可以用Thread类的
静态方法set
DefaultUncaughtExceptionHandler为所有的线程安装一个默认的处理器。
替换处理器可以使用日志API发送未捕获异常的报告到日志文件。
如果不安装默认的处理器,默认处理器(getDefaultUncaughtExceptionHandler)为空。但是,如果不为独立的线程安装处理器(getUncaughtExceptionHandler),此时的处理器就是该线程的ThreadGroup对象。
注意 : 线程组是一个可以统一管理的线程集合。默认情况下,创建的所有线程属于相同的线程组,但是,也可能会建立其他的组。从Java SE 5.0起引入了更好的特性用于线程集合的操作。不要在自己的程序中使用线程组。
ThreadGroup类实现Thread.UncaughtExceptionHandler接口,它的uncaughtException方法做如下操作:
(1).如果该线程组有夫线程组,那么父线程组的uncaughtException方法被调用。
(2).否则,如果Thread.getDefaultExceptionHandler方法返回一个非空的处理器,则调用该处理器
(3).否则,如果Throwable是ThreadDeath的一个实例,什么都不做。
(4).否则,线程的名字以及Throwable的栈踪迹被输出到System.err上。