Java学习day091 并发(三)(线程属性:线程优先级、守护线程、未捕获异常处理器)

使用的教材是java核心技术卷1,我将跟着这本书的章节同时配合视频资源来进行学习基础java知识。

day091   并发(三)(线程属性:线程优先级、守护线程、未捕获异常处理器)


1.线程优先级

在Java程序设计语言中,每一个线程有一个优先级。默认情况下,一+线程继承它的父线程的优先级。可以用setPriority方法提高或降低任何一个线程的优先级。可以将优先级设置为在MIN_PRIORITY(在Thread类中定义为1)与MAX_PRIORITY(定义为10)之间的任何值。NORM_PRIORITY被定义为5。

每当线程调度器有机会选择新线程时,它首先选择具有较高优先级的线程。但是,线程优先级是高度依赖于系统的。当虚拟机依赖于宿主机平台的线程实现机制时,Java线程的优先级被映射到宿主机平台的优先级上,优先级个数也许更多,也许更少。

例如,Windows有7个优先级别。一些Java优先级将映射到相同的操作系统优先级。在Oracle为Linux提供的Java虚拟机中,线程的优先级被忽略一所有线程具有相同的优先级。初级程序员常常过度使用线程优先级。为优先级而烦恼是事出有因的。不要将程序构建为功能的正确性依赖于优先级。

Java学习day091 并发(三)(线程属性:线程优先级、守护线程、未捕获异常处理器)_第1张图片

Java学习day091 并发(三)(线程属性:线程优先级、守护线程、未捕获异常处理器)_第2张图片


2.守护线程

可以通过调用

t.setDaemon(true);

将线程转换为守护线程(daemon thread)。这样一个线程没有什么神奇。守护线程的唯一用途是为其他线程提供服务。计时线程就是一个例子,它定时地发送“计时器嘀嗒”信号给其他线程或清空过时的高速缓存项的线程。当只剩下守护线程时,虚拟机就退出了,由于如果只剩下守护线程,就没必要继续运行程序了。守护线程有时会被初学者错误地使用,他们不打算考虑关机(shutdown)动作。但是,这是很危险的。守护线程应该永远不去访问固有资源,如文件、数据库,因为它会在任何时候甚至在一个操作的中间发生中断。


3.未捕获异常处理器

线程的run方法不能抛出任何受查异常,但是,非受査异常会导致线程终止。在这种情况下,线程就死亡了。

但是,不需要任何catch子句来处理可以被传播的异常。相反,就在线程死亡之前,异常被传递到一个用于未捕获异常的处理器。

该处理器必须属于一个实现Thread.UncaughtExceptionHandler接口的类。这个接口只有—个方法。

void uncaughtException(Thread t,Throwable e)

可以用setUncaughtExceptionHandler方法为任何线程安装一个处理器。

也可以用Thread类的静态方法setDefaultUncaughtExceptionHandler为所有线程安装一个默认的处理器。替换处理器可以使用日志API发送未捕获异常的报告到日志文件。

如果不安装默认的处理器,默认的处理器为空。但是,如果不为独立的线程安装处理器,此时的处理器就是该线程的ThreadGroup对象。

ThreadGroup类实现Thread.UncaughtExceptionHandler接口。它的uncaughtException方法做如下操作:

1)如果该线程组有父线程组,那么父线程组的uncaughtException方法被调用。

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

3)否则,如果Throwable是ThreadDeath的一个实例,什么都不做。

4)否则,线程的名字以及Throwable的栈轨迹被输出到System.err上。

这是你在程序中肯定看到过许多次的栈轨迹。

Java学习day091 并发(三)(线程属性:线程优先级、守护线程、未捕获异常处理器)_第3张图片


 

你可能感兴趣的:(Java基础学习)