1、线程优先级:每条线程都有一个优先级,默认情况下,主线程的优先级是5(NOR_PRIORITY),子线程继承它父线程的优先级。可以用setPriority方法给一条线程设置优先级(MIN_PRIORITY=1,MAX_PRIORITY=10)。
每当线程调度器有机会选择新线程时,它首先会选择具有较高优先级的线程。但是,线程优先级是高度依赖于系统的。当虚拟机依赖于宿主机平台的线程实现机制时,Java线程的优先级被映射到宿主机平台的优先级上,这种映射在常见的操作系统上都不能很好地实现。比如Windows有7个优先级,有几个Java优先级将映射到相同的操作系统优先级。又比如在Sun公司为Linux提供的Java虚拟机里,所有的线程都有相同的优先级(优先级被忽略)。还有,Android中线程优先级是从-20到19.
构建程序时,不要将功能的正确性依赖于优先级。如果确实要使用优先级,应该避免初学者常犯的一个错误:如果有几个高优先级的线程没有进入非活动状态,低优先级的线程可能永远也不能执行。
2、守护线程:可以调用t.setDaemon(true)将线程转换为守护线程。守护线程的唯一作用是为其它线程提供服务。比如计时线程。当只剩下守护线程时,虚拟机就退出了。
使用守护线程是应该考虑的一个问题:守护线程应该永远不去访问固有资源,比如文件、数据库等,因为它会在任何时候甚至在一个操作的中间发生中断。
3.未捕获异常处理器:线程的run方法不能抛出任何被检测的(checked)异常,但是,不被检测的(unchecked)异常会导致线程终止。在这种情况下,线程就会死亡。
但是,不需要任何catch子句来处理可以被传播的异常。在线程死亡之前,异常被传递到一个用于未捕获异常的处理器。
该处理器必须属于一个实现了Thread.UncaughtExceptionHandler接口的类。可以用setUncaughtExceptionHandler方法为任何线程安装一个处理器。也可以用Thread类的静态方法setDefaultUncaughtExceptionHandler为所有线程安装一个默认的处理器。替换处理器的好处就是可以使用日志API发送未捕获的异常的报告到文件。
如果不安装默认的处理器,默认的处理器就为空。但是,如果不为独立的线程安装处理器,此时的处理器就是该线程的ThreadGroup(它实现了UncaughtExceptionHandler接口)。
ThreadGroup类实现了Thread.UncaughtExceptionHandler接口,它的uncaughtException方法做如下操作:
1)如果该线程组有父线程组,那么父线程组的uncaughtException方法被调用。
2)否则,如果Thread.getDefaultExceptionHandler方法返回一个非空的处理器,则调用该处理器。
3)否则,如果Throwable是ThreadDeath的一个实例(ThreadDeath对象由stop方法产生,而该方法已过时),什么都不做。
4)否则,线程的名字以及Throwable的栈踪迹被输出到System.err上。